Apa regex untuk "Semua bilangan bulat positif, tidak termasuk 0"

93

Bagaimana cara ^\d+$ditingkatkan menjadi tidak mengizinkan 0?

EDIT (Buat lebih konkret):

Contoh yang diizinkan:
1
30
111
Contoh yang dilarang:
0
00
-22

Tidak masalah apakah bilangan positif dengan nol di depannya diperbolehkan atau tidak (misalnya 022).

Ini untuk implementasi Regex JDK Java.

Zeemee
sumber
2
Apakah Anda ingin menerima, misalnya 076,?
Karl Knechtel - jauh dari rumah
@Karl Knechtel: Tapi saya bisa mengorbankan fitur ini demi kesederhanaan.
Zeemee
3
“Semua bilangan bulat positif, tidak termasuk 0” perhatikan bahwa 0 bukan bilangan bulat positif.
SK9

Jawaban:

180

Coba ini:

^[1-9]\d*$

... dan beberapa padding melebihi batas jawaban SO 30 karakter :-).

Ini Demo

Tomasz Nurkiewicz
sumber
Hanya ingin tahu, mengapa kita membutuhkan \ d + di akhir? Mengapa tidak ^[1-9]+$berhasil?
mtahmed
18
@ mmtahmed: ^[1-9]+$tidak akan mengizinkan 10
Lie Ryan
1
Ini akan memungkinkan 1. "\ d *" juga cocok dengan string kosong.
Daniel
@mtahmed ^[1-9]+$tidak mengizinkan 10. @Mulmoth saran akan memungkinkan 1, karena \d*cocok nol kali atau lebih. Namun, itu tidak akan mengizinkan 076, karena itu tidak dimulai dengan [1-9].
Karl Knechtel - jauh dari rumah
2
Tapi bagaimana dengan 01?
Museful
72

Maaf terlambat datang tapi OP ingin mengizinkan 076tapi mungkin TIDAK mau mengizinkan 0000000000.

Jadi dalam hal ini kita menginginkan string dengan satu atau lebih digit yang mengandung setidaknya satu bukan nol . Itu adalah

^[0-9]*[1-9][0-9]*$
Ray Toal
sumber
Ini tampaknya memenuhi apa yang diinginkan OP
Abdul
saya ingin bilangan bulat positif dan desimal positif. Anda punya solusi?
Anda harus menanyakannya sebagai pertanyaan baru daripada sebagai komentar. Tapi spoiler: ^[0-9]*[1-9][0-9]*(\.[0-9]+)$tapi itu membuat asumsi tentang apa yang Anda maksud dengan "desimal." Apakah Anda membutuhkan bagian eksponen? Ini cukup rumit, jadi tanyakan pertanyaan lain.
Ray Toal
1
1 untuk mempertimbangkan kasus sudut! BTW pola ini akan bekerja persis sama: ^0*[1-9]\d*$karena yang pertama [0-9]*hanya aktif sampai [1-9]menemukan yang pertama bukan nol yaitu hanya aktif sampai ada awal nol ( 0*).
mg007
1
Ini adalah jawaban yang benar. Ini menerima 00098 yang merupakan perilaku yang benar sesuai pertanyaan.
Varun Sharma
20

Anda dapat mencoba pernyataan kepala penampil negatif:

^(?!0+$)\d+$
Karl Knechtel - jauh dari rumah
sumber
30
Ya Tuhan, saya takut.
Daniel
1
Hal ini memungkinkan 01, 02, dll…
Matijs
12

Coba yang ini, yang ini bekerja paling baik untuk memenuhi persyaratan.

[1-9][0-9]*

Berikut adalah contoh keluarannya

String 0 matches regex: false
String 1 matches regex: true
String 2 matches regex: true
String 3 matches regex: true
String 4 matches regex: true
String 5 matches regex: true
String 6 matches regex: true
String 7 matches regex: true
String 8 matches regex: true
String 9 matches regex: true
String 10 matches regex: true
String 11 matches regex: true
String 12 matches regex: true
String 13 matches regex: true
String 14 matches regex: true
String 15 matches regex: true
String 16 matches regex: true
String 999 matches regex: true
String 2654 matches regex: true
String 25633 matches regex: true
String 254444 matches regex: true
String 0.1 matches regex: false
String 0.2 matches regex: false
String 0.3 matches regex: false
String -1 matches regex: false
String -2 matches regex: false
String -5 matches regex: false
String -6 matches regex: false
String -6.8 matches regex: false
String -9 matches regex: false
String -54 matches regex: false
String -29 matches regex: false
String 1000 matches regex: true
String 100000 matches regex: true
Palash Kanti Kundu
sumber
2
Terima kasih, tetapi itu tidak menambah nilai atau keanggunan jika dibandingkan dengan jawaban yang diterima [1-9]\d*.
Zeemee
1
@Zeemee yang tidak benar karena \ d mungkin menyertakan angka yang bukan 0-9. Misalnya angka Arab seperti واحد di beberapa perpustakaan.
dummyDev
@dummyDev Saya tidak menyadarinya. Terima kasih telah menyebutkan!
Zeemee
Sayangnya ini akan mengembalikan true untuk "123abcd".
Charith Jayasanka
Charith Jayasanka - ya, masih membutuhkan ^ di awal dan "$" di akhir :-)
Steve Baroti
7

^\d*[1-9]\d*$

ini dapat mencakup semua nilai positif, meskipun diberi tanda Nol di depan

Izinkan

1

01

10

11 dll

jangan perbolehkan

0

00

000 dll ..

manoj
sumber
3

Semua bilangan bulat positif, tidak termasuk 0: ^\+?[1-9]\d*$
Semua bilangan bulat positif, termasuk 0:^(0|\+?[1-9]\d*)$

pengguna11856357
sumber
2

Punya yang ini:

^[1-9]|[0-9]{2,}$

Seseorang mengalahkannya? :)

Zeemee
sumber
3
Ini akan memungkinkan 00Apakah Anda menginginkan ini? Dan itu akan memungkinkan 1aaaaadan abcd01. ^hanya milik alternatif pertama dan $hanya untuk yang kedua, untuk menyelesaikan ini menempatkan tanda kurung di sekitarnya^([1-9]|[0-9]{2,})$
stema
Nah, ini menerima 000000000. Anda memang mengatakan bilangan bulat apa pun kecuali nol .
Ray Toal
2

Hanya untuk bersenang-senang, alternatif lain menggunakan lookahead:

^(?=\d*[1-9])\d+$

Digit sebanyak yang Anda inginkan, tetapi setidaknya satu digit harus [1-9].

porges
sumber
2

Anda mungkin menginginkan ini (edit: allow number of the form 0123):

^\\+?[1-9]$|^\\+?\d+$

Namun, jika itu saya, saya akan melakukannya

int x = Integer.parseInt(s)
if (x > 0) {...}
Lie Ryan
sumber
1
Dua masalah: Ini juga cocok dengan "123abc", dan menampilkan 123, dan ini mungkin memunculkan ParseException.
Daniel
@ Daniel: Saya kira ini mungkin digunakan di dalam skema parsing yang lebih besar, oleh karena itu Anda akan memiliki regex / BNF yang hanya menangkap digit, dan kode java untuk memeriksa bahwa digit yang ditangkap positif bukan nol.
Lie Ryan
@Daniel: bagaimanapun juga, Anda masih membutuhkan data sebagai integer dan cepat atau lambat Anda masih perlu memanggil parseInt () atau menggulung parseInt () Anda sendiri.
Lie Ryan
@ Daniel: dengan Integer.parseInt()sendirinya menambahkan sedikit biaya tambahan. Melempar dan menangkap pengecualian itulah yang mahal.
Alan Moore
@ Lie: apa masalahnya dengan \\+?prefiks? Saya menduga itu seharusnya menjadi tanda plus yang lolos seperti yang akan muncul di kode sumber Java, tetapi mengapa? Jika tanda minus tidak diperbolehkan, saya pikir aman untuk mengasumsikan tanda plus juga dihilangkan.
Alan Moore
0

RegEx ini cocok dengan semua bilangan bulat positif dari 0:

(?<!-)(?<!\d)[1-9][0-9]*

Ia bekerja dengan dua lookbehinds negatif, yang mencari minus sebelum angka, yang menandakan itu adalah angka negatif. Ini juga berfungsi untuk bilangan negatif apa pun yang lebih besar dari -9 (mis. -22).

Alexander Hammans
sumber
0

Pola saya rumit, tetapi mencakup persis "Semua bilangan bulat positif, tidak termasuk 0" (1 - 2147483647, tidak panjang). Ini untuk angka desimal dan tidak mengizinkan angka nol di depan.

^((1?[1-9][0-9]{0,8})|20[0-9]{8}|(21[0-3][0-9]{7})|(214[0-6][0-9]{6})
|(2147[0-3][0-9]{5})|(21474[0-7][0-9]{4})|(214748[0-2][0-9]{3})
|(2147483[0-5][0-9]{2})|(21474836[0-3][0-9])|(214748364[0-7]))$
OleksiiMLD
sumber
-2

^ [1-9] * $ adalah yang paling sederhana yang dapat saya pikirkan


sumber
Persamaan reguler ini akan gagal mencocokkan angka seperti 10dan 29303. Ini juga akan cocok dengan string kosong.
OmnipotentEntity
-3

Ini seharusnya hanya mengizinkan desimal> 0

^([0-9]\.\d+)|([1-9]\d*\.?\d*)$
pengguna259469
sumber