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.


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


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]*$

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


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

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


3

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


2

Habe diesen:

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

Jemand schlägt es? :) :)


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) {...}

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


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


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

-2

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


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*)$
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.