Jakie jest wyrażenie regularne dla „Dowolnej dodatniej liczby całkowitej, z wyłączeniem 0”


93

Jak można ^\d+$ulepszyć zakazanie 0?

EDYTUJ (uczyń go bardziej konkretnym):

Przykłady dozwolonych:
1
30
111
Przykłady zakazu:
0
00
-22

Nie ma znaczenia, czy liczby dodatnie z zerem wiodącym są dozwolone, czy nie (np 022.).

Dotyczy to implementacji Java JDK Regex.


2
Czy chcesz na przykład zaakceptować 076?
Karl Knechtel - poza domem

@Karl Knechtel: Ale mogę poświęcić tę funkcję ze względu na prostotę.
Zeemee

3
„Dowolna dodatnia liczba całkowita, z wyłączeniem 0” oznacza, że ​​0 nie jest dodatnią liczbą całkowitą.
SK9

Odpowiedzi:


180

Spróbuj tego:

^[1-9]\d*$

... i trochę dopełnienia, aby przekroczyć 30-znakowy limit odpowiedzi SO :-).

Oto Demo


Tylko z ciekawości, po co nam na końcu \ d +? Dlaczego nie miałoby ^[1-9]+$działać?
mtahmed

18
@mtahmed: ^[1-9]+$nie pozwoli na 10
Lie Ryan

1
Pozwoli to 1. „\ d *” pasuje również do pustego łańcucha.
Daniel,

@mtahmed ^[1-9]+$nie pozwoli 10. @Mulmoth - sugestia pozwoli 1, ponieważ \d*pasuje zero lub więcej razy. Jednak nie pozwoli 076, ponieważ to nie zaczyna się od [1-9].
Karl Knechtel - poza domem

2
Ale co z tym 01?
Rozmyślny

72

Przepraszam, że spóźniłem się, ale OP chce zezwolić, 076ale prawdopodobnie NIE chce 0000000000.

W tym przypadku chcemy, aby ciąg jednej lub więcej cyfr zawierał co najmniej jedną wartość różną od zera . To jest

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

Wydaje się, że spełnia to to, czego chciał PO
Abdul

chcę dodatnią liczbę całkowitą i dodatnią liczbę dziesiętną. masz jakieś rozwiązanie?

Powinieneś zadać to jako nowe pytanie, a nie jako komentarz. Ale spoiler: ^[0-9]*[1-9][0-9]*(\.[0-9]+)$ale to jest założenie, co masz na myśli, mówiąc o „dziesiętnym”. Czy potrzebujesz części potęgi? To dość skomplikowane, więc zadaj kolejne pytanie.
Ray Toal

1
+1 za rozważenie przypadku narożnego! Przy okazji ten wzorzec będzie działał dokładnie tak samo: ^0*[1-9]\d*$ponieważ pierwszy [0-9]*jest aktywny tylko do momentu [1-9]znalezienia pierwszej wartości niezerowej, czyli jest aktywny tylko do początkowych zer ( 0*).
mg007

1
To jest właściwa odpowiedź. Akceptuje 00098, co jest poprawnym zachowaniem zgodnie z pytaniem.
Varun Sharma


12

Spróbuj tego, ten działa najlepiej, aby zaspokoić wymagania.

[1-9][0-9]*

Oto przykładowe dane wyjściowe

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
Dziękuję, ale nie dodaje to żadnej wartości ani elegancji w porównaniu z zaakceptowaną odpowiedzią [1-9]\d*.
Zeemee,

1
@Zeemee, która nie jest poprawna, ponieważ \ d może zawierać cyfry inne niż 0-9. Na przykład cyfry arabskie, takie jak واحد w niektórych bibliotekach.
dummyDev

@dummyDev Nie byłem tego świadomy. Dziękuję za wspomnienie!
Zeemee

Niestety, w przypadku „123abcd” to powróci.
Charith Jayasanka

Charith Jayasanka - tak, nadal potrzebuje ^ na początku i „$” na końcu :-)
Steve Baroti

7

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

może to obejmować wszystkie wartości dodatnie, nawet jeśli z przodu jest wypełnione zerami

Pozwala

1

01

10

11 itp

nie pozwalaj

0

00

000 itd.


3

Dowolna dodatnia liczba całkowita, z wyłączeniem 0: ^\+?[1-9]\d*$
Dowolna dodatnia liczba całkowita, w tym 0:^(0|\+?[1-9]\d*)$


2

Mam ten:

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

Ktoś to bije? :)


3
To pozwoliłoby 00Czy chcesz tego? I to pozwoli 1aaaaai abcd01. ^należy tylko do pierwszej alternatywy i $tylko do drugiej, aby rozwiązać ten problem, umieść wokół niej nawiasy^([1-9]|[0-9]{2,})$
stema

Cóż, to się zgadza 000000000. Powiedziałeś dowolną liczbę całkowitą z wyłączeniem zera .
Ray Toal,

2

Dla zabawy, kolejna alternatywa dla lookaheads:

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

Tyle cyfr, ile chcesz, ale przynajmniej jedna musi być [1-9].


2

Możesz tego chcieć (edytuj: zezwól na numer formularza 0123):

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

jednak gdybym to był ja, zrobiłbym to zamiast tego

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

1
Dwa problemy: to również dopasowuje „123abc” i zwraca 123, co może spowodować zgłoszenie ParseException.
Daniel,

@Daniel: Wydaje mi się, że może to być użyte w ramach większego schematu analizy, dlatego miałbyś wyrażenie regularne / BNF, które przechwytuje tylko cyfry, i kod java, aby sprawdzić, czy przechwycone cyfry są niezerowe dodatnie.
Lie Ryan

@Daniel: w każdym razie nadal potrzebujesz danych jako liczby całkowitej, więc prędzej czy później nadal będziesz musiał wywołać parseInt () lub rzucić własną parseInt ().
Lie Ryan

@Daniel: Integer.parseInt()samo w sobie dodaje bardzo niewiele narzutów. To wyrzucanie i łapanie wyjątków jest drogie.
Alan Moore

@Lie: o co chodzi z \\+?prefiksami? Zgaduję, że ma to być znak ucieczki plus, tak jak pojawiłby się w kodzie źródłowym Java, ale dlaczego? Jeśli znaki minus nie są dozwolone, myślę, że można bezpiecznie założyć, że znaki plus również są wyłączone.
Alan Moore

0

To wyrażenie regularne pasuje do dowolnej liczby całkowitej dodatniej z 0:

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

Działa z dwoma ujemnymi wybiegami wstecznymi, które szukają minus przed liczbą, co wskazuje, że jest to liczba ujemna. Działa również dla każdej liczby ujemnej większej niż -9 (np. -22).


0

Mój wzorzec jest skomplikowany, ale obejmuje dokładnie „Dowolną dodatnią liczbę całkowitą z wyłączeniem 0” (1 - 2147483647, krótka). Dotyczy liczb dziesiętnych i nie zezwala na zera wiodące.

^((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] * $ jest najprostszym, jaki przychodzi mi do głowy


To wyrażenie regularne błędnie nie dopasuje liczb, takich jak 10i 29303. Dopasuje również pusty ciąg.
OmnipotentEntity

-3

Powinno to dopuszczać tylko liczby dziesiętne> 0

^([0-9]\.\d+)|([1-9]\d*\.?\d*)$
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.