Was ist die Regex für "Jede positive ganze Zahl, außer 0"?

90

Wie kann ^\d+$verbessert werden, um nicht zuzulassen 0?

BEARBEITEN (konkreter machen):

Zuzulassende Beispiele:
1
30
111
Nicht zuzulassende Beispiele:
0
00
-22

Es spielt keine Rolle, ob positive Zahlen mit einer führenden Null zulässig sind oder nicht (z 022. B. ).

Dies ist für die Implementierung von Java JDK Regex vorgesehen.

Zeemee
quelle
2
Möchten Sie zum Beispiel akzeptieren 076?
Karl Knechtel - von zu Hause weg
@ Karl Knechtel: Aber ich kann diese Funktion der Einfachheit halber opfern.
Zeemee
3
"Jede positive Ganzzahl ohne 0" Beachten Sie, dass 0 keine positive Ganzzahl ist.
SK9

Antworten:

175

Versuche dies:

^[1-9]\d*$

... und etwas Polsterung, um das SO-Antwortlimit von 30 Zeichen zu überschreiten :-).

Hier ist Demo

Tomasz Nurkiewicz
quelle
Nur aus Neugier, warum brauchen wir am Ende \ d +? Warum würde es nicht ^[1-9]+$funktionieren?
Mtahmed
18
@mtahmed: ^[1-9]+$würde nicht erlauben 10
Lie Ryan
1
Es wird 1 erlaubt. "\ D *" stimmt auch mit der leeren Zeichenfolge überein.
Daniel
@mtahmed ^[1-9]+$würde nicht zulassen 10. @ Mulmoth wird der Vorschlag erlauben 1, da \d*Übereinstimmungen null oder mehrmals. Dies wird jedoch nicht zugelassen 076, da dies nicht mit a beginnt [1-9].
Karl Knechtel - von zu Hause weg
1
Aber was ist mit 01?
Museful
69

Es 076tut mir leid, dass ich zu spät komme, aber das OP möchte es zulassen , möchte es aber wahrscheinlich NICHT zulassen 0000000000.

In diesem Fall möchten wir also eine Zeichenfolge mit einer oder mehreren Ziffern, die mindestens eine Nicht-Null enthält . Das ist

^[0-9]*[1-9][0-9]*$
Ray Toal
quelle
Dies scheint zu erfüllen, was die OP wollte
Abdul
Ich möchte eine positive ganze Zahl und eine positive Dezimalzahl. Hast du eine Lösung?
Sie sollten dies eher als neue Frage als als Kommentar stellen. Aber Spoiler: ^[0-9]*[1-9][0-9]*(\.[0-9]+)$Aber das ist eine Annahme darüber, was Sie mit "dezimal" meinen. Benötigen Sie Exponententeile? Das ist ziemlich kompliziert, also stellen Sie eine andere Frage.
Ray Toal
1
+1 für die Berücksichtigung des Eckfalls! Übrigens funktioniert dieses Muster genauso: ^0*[1-9]\d*$da das erste [0-9]*nur aktiv ist, bis [1-9]das erste Nicht-Null-Element gefunden wird, dh es ist nur aktiv, bis es anfängliche Nullen gibt ( 0*).
mg007
Ja, das ist das Beste.
Ray Toal
19

Sie könnten eine negative Lookahead-Behauptung versuchen:

^(?!0+$)\d+$
Karl Knechtel - von zu Hause weg
quelle
29
Oh mein Gott, ich habe Angst.
Daniel
Dies ermöglicht 01, 02, etc…
Matijs
12

Versuchen Sie dieses, dieses funktioniert am besten, um die Anforderung zu genügen.

[1-9][0-9]*

Hier ist die Beispielausgabe

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
quelle
2
Vielen Dank, aber es bringt keinen Wert oder Eleganz im Vergleich zur akzeptierten Antwort [1-9]\d*.
Zeemee
1
@Zeemee, das nicht korrekt ist, da \ d möglicherweise Ziffern enthält, die nicht 0-9 sind. Zum Beispiel arabische Ziffern wie واحد in einigen Bibliotheken.
DummyDev
@dummyDev Das war mir nicht bewusst. Vielen Dank für die Erwähnung!
Zeemee
Leider wird dies für "123abcd" wahr sein.
Charith Jayasanka
Charith Jayasanka - ja, es braucht noch ein ^ am Anfang und ein "$" am Ende :-)
Steve Baroti
7

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

Dies kann alle positiven Werte einschließen, auch wenn sie vorne mit Null aufgefüllt sind

Erlaubt

1

01

10

11 etc.

nicht zulassen

0

00

000 etc ..

Manoj
quelle
3

Beliebige positive Ganzzahl, ausgenommen 0: ^\+?[1-9]\d*$
Beliebige positive Ganzzahl, einschließlich 0:^(0|\+?[1-9]\d*)$

user11856357
quelle
2

Habe diesen:

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

Jemand schlägt es? :) :)

Zeemee
quelle
3
Dies würde erlauben, 00willst du das? Und es wird erlauben 1aaaaaund abcd01. ^gehört nur zur ersten Alternative und $nur zur zweiten, um diese Klammern zu lösen^([1-9]|[0-9]{2,})$
Stema
Nun, das akzeptiert 000000000. Sie haben eine ganze Zahl ohne Null gesagt .
Ray Toal
2

Vielleicht möchten Sie dies (bearbeiten: Nummer des Formulars zulassen 0123):

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

Wenn ich es wäre, würde ich es stattdessen tun

int x = Integer.parseInt(s)
if (x > 0) {...}
Lie Ryan
quelle
1
Zwei Probleme: Dies entspricht auch "123abc" und gibt 123 zurück. Dies kann eine ParseException auslösen.
Daniel
@ Daniel: Ich denke, dies könnte in einem größeren Parsing-Schema verwendet werden, daher hätten Sie einen regulären Ausdruck / BNF, der nur Ziffern erfasst, und einen Java-Code, um zu überprüfen, ob die erfassten Ziffern nicht Null-positiv sind.
Lie Ryan
@ Daniel: In jedem Fall würden Sie die Daten immer noch als Ganzzahl benötigen und so müssten Sie früher oder später immer noch parseInt () aufrufen oder Ihr eigenes parseInt () rollen.
Lie Ryan
@ Daniel: Integer.parseInt()selbst fügt sehr wenig Overhead hinzu. Das Werfen und Fangen von Ausnahmen ist teuer.
Alan Moore
@Lie: Was ist mit den \\+?Präfixen los? Ich vermute, dass dies ein Pluszeichen sein soll, wie es im Java-Quellcode erscheinen würde, aber warum? Wenn Minuszeichen nicht erlaubt sind, kann man davon ausgehen, dass auch Pluszeichen aus sind.
Alan Moore
1

Nur zum Spaß, eine andere Alternative mit Lookaheads:

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

So viele Ziffern wie Sie möchten, aber mindestens eine muss sein [1-9].

porges
quelle
0

Diese RegEx stimmt mit jeder positiven Ganzzahl von 0 überein:

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

Es funktioniert mit zwei negativen Lookbehinds, die vor einer Zahl nach einem Minus suchen, was darauf hinweist, dass es sich um eine negative Zahl handelt. Es funktioniert auch für jede negative Zahl größer als -9 (z. B. -22).

Alexander Hammans
quelle
0

Mein Muster ist kompliziert, aber es deckt genau "Jede positive ganze Zahl außer 0" ab (1 - 2147483647, nicht lang). Es ist für Dezimalzahlen und erlaubt keine führenden Nullen.

^((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
quelle
-2

^ [1-9] * $ ist das einfachste, was ich mir vorstellen kann


quelle
Dieser reguläre Ausdruck stimmt fälschlicherweise nicht mit Zahlen wie 10und überein 29303. Es wird auch mit einer leeren Zeichenfolge übereinstimmen.
OmnipotentEntity
-3

Dies sollte nur Dezimalstellen> 0 zulassen

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