"0 hariç herhangi bir pozitif tam sayı" için normal ifade nedir


93

^\d+$İzin vermemek için nasıl geliştirilebilir 0?

DÜZENLE (Daha somut hale getirin):

Örnekler izin vermek için:
1
30
111
red etme için örnekler:
0
00
-22

Başında sıfır olan pozitif sayılara izin verilip verilmediğinin önemi yoktur (örneğin 022).

Bu Java JDK Regex uygulaması içindir.


2
Örneğin kabul etmek ister misin 076?
Karl Knechtel -

@Karl Knechtel: Ama basitlik uğruna bu özelliği feda edebilirim.
Zeemee

3
"0 hariç herhangi bir pozitif tam sayı", 0'ın pozitif bir tam sayı olmadığını not eder.
SK9

Yanıtlar:


180

Bunu dene:

^[1-9]\d*$

... ve 30 karakter SO cevap sınırını aşacak bazı dolgu :-).

İşte Demo


Sadece meraktan soruyorum, sonunda neden \ d + 'ya ihtiyacımız var? Neden ^[1-9]+$çalışmasın?
mtahmed

18
@mtahmed: ^[1-9]+$10'a izin vermez
Lie Ryan

1
1'e izin verecektir. "\ D *" ayrıca boş dizeyle eşleşir.
Daniel

@mtahmed ^[1-9]+$izin vermez 10. @Mulmoth öneri sağlayacak 1beri \d*maçları sıfır veya daha fazla kez. Ancak, 076bir ile başlamadığı için izin vermeyecektir [1-9].
Karl Knechtel -

2
Peki ya ne olacak 01?
Museful

72

Geç geldiğim için üzgünüm ama OP izin vermek istiyor 076ama muhtemelen izin vermek istemiyor 0000000000.

Bu durumda , sıfır olmayan en az bir tane içeren bir veya daha fazla basamaklı bir dizi istiyoruz . Yani

^[0-9]*[1-9][0-9]*$

Bu, OP'nin istediği şeyi yerine getiriyor gibi görünüyor
Abdul

pozitif tamsayı ve pozitif ondalık istiyorum. herhangi bir çözümün var mı?

Bunu bir yorum olarak değil, yeni bir soru olarak sormalısınız. Ama spoiler: ^[0-9]*[1-9][0-9]*(\.[0-9]+)$ama bu, "ondalık" ile ne kastettiğin hakkında bir varsayımda bulunuyor. Üslü parçalara ihtiyacınız var mı? Bu oldukça karmaşık, bu yüzden başka bir soru sorun.
Ray Toal

1
Köşe davayı düşündüğünüz için +1! BTW bu model tam olarak aynı şekilde çalışacaktır: ^0*[1-9]\d*$çünkü ilki [0-9]*yalnızca [1-9]ilk sıfır olmayan bulana kadar aktiftir, yani yalnızca ilk sıfırlar ( 0*) olana kadar etkindir .
mg007

1
Bu doğru cevap. Soru başına doğru davranış olan 00098'i kabul eder.
Varun Sharma


12

Bunu deneyin, bu, gereksinimi karşılamak için en iyi sonucu verir.

[1-9][0-9]*

İşte örnek çıktı

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

2
Teşekkürler, ancak kabul edilen cevaba kıyasla herhangi bir değer veya zarafet katmıyor [1-9]\d*.
Zeemee

1
Doğru olmayan @Zeemee, \ d 0-9 olmayan rakamlar içerebilir. Örneğin, bazı kütüphanelerde واحد gibi Arap rakamları.
dummyDev

@dummyDev Bunun farkında değildim. Bahsettiğiniz için teşekkürler!
Zeemee

Ne yazık ki bu "123abcd" için doğru dönecek.
Charith Jayasanka

Charith Jayasanka - evet, başında ^ ve sonunda bir "$" olması gerekiyor :-)
Steve Baroti

7

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

bu, önde Sıfır ile doldurulmuş olsa bile tüm pozitif değerleri içerebilir

İzin verir

1

01

10

11 vb.

izin verme

0

00

000 vb ..


3

0 hariç ^\+?[1-9]\d*$
herhangi bir pozitif tam sayı: 0 dahil herhangi bir pozitif tam sayı:^(0|\+?[1-9]\d*)$


2

Bunu anladım:

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

Biri onu yener mi? :)


3
Bu izin verir 00Bunu ister misin? Ve izin verecek 1aaaaave abcd01. ^sadece ilk alternatife ve $sadece ikinciye aittir , bunu çözmek için etrafına parantez koyun^([1-9]|[0-9]{2,})$
stema

Bu kabul ediyor 000000000. Sıfır hariç herhangi bir tamsayı söylediniz .
Ray Toal

2

Sadece eğlence için, ileri görüşlü başka bir alternatif:

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

İstediğiniz kadar rakam, ancak en az biri olmalıdır [1-9].


2

Bunu isteyebilirsiniz (düzenleme: formun numarasına izin verin 0123):

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

ancak, ben olsam yerine yapardım

int x = Integer.parseInt(s)
if (x > 0) {...}

1
İki sorun: Bu aynı zamanda "123abc" ile eşleşir ve 123 döndürür ve bu bir ParseException oluşturabilir.
Daniel

@Daniel: Sanırım bu daha büyük bir ayrıştırma şemasında kullanılabilir, bu nedenle yalnızca rakamları yakalayan bir regex / BNF'ye ve yakalanan rakamların sıfır olmayan pozitif olduğunu kontrol etmek için bir java koduna sahip olursunuz.
Lie Ryan

@Daniel: Her durumda, verilere bir tamsayı olarak hala ihtiyaç duyacaksınız ve er ya da geç yine de parseInt () 'i çağırmanız veya kendi parseInt ()' inizi döndürmeniz gerekecektir.
Lie Ryan

@Daniel: Integer.parseInt()kendisi çok az ek yük katıyor. Pahalı olan istisnaların fırlatılması ve yakalanmasıdır.
Alan Moore

@Lie: Öneklerle anlaşma \\+?nedir? Sanırım bunun Java kaynak kodunda göründüğü gibi kaçan bir artı işareti olması gerekiyordu, ama neden? Eksi işaretlerine izin verilmiyorsa, artı işaretlerinin de devre dışı olduğunu varsaymanın güvenli olduğunu düşünüyorum.
Alan Moore

0

Bu Normal İfade, 0 üzerinden pozitif herhangi bir Tamsayı ile eşleşir:

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

Bir sayıdan önce bir eksi arayan ve bunun negatif bir sayı olduğunu gösteren iki negatif arkaya bakma ile çalışır. Ayrıca -9'dan büyük herhangi bir negatif sayı için de işe yarar (örneğin -22).


0

Örüntü karmaşıktır, ancak "0 hariç herhangi bir pozitif tamsayıyı" kapsar (1 - 2147483647, uzun değil). Ondalık sayılar içindir ve baştaki sıfırlara izin vermez.

^((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]))$

-2

^ [1-9] * $, aklıma gelen en basit şey


Bu normal ifade, yanlışlıkla 10ve gibi sayılarla eşleşmede başarısız olacaktır 29303. Ayrıca boş dizeyle eşleşecektir.
OmnipotentEntity

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.