"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.