2016-06-21 7 views
2

Kann mir jemand beim Schreiben eines regulären Ausdrucks helfen, der ganzzahlige Werte und null (Wort null oder NULL) aber keine Dezimalstellen und Zeichenfolgen akzeptiert.Regulärer Ausdruck, der Ganzzahlen und Null akzeptiert

Ich habe versucht, mit Ausdrücken:

/^([nN][uU][lL][lL])?|(-?\d+?)?$/  
/^(null|NULL)?|(-?\d+?)?$/ 

aber sie sind Strings und Kombination von Anzahl und Strings zu akzeptieren.

+3

Weil Ihr Anker nicht in Faktor sind mit den zwei Branchen s der Abwechslung. Der erste hat die Anfangsanker, der zweite den Endanker. –

+1

Verwenden Sie einfach eine Gruppe um das Muster zwischen den Ankern: '^ (null | NULL | -? \ D +)? $' (Dies wird auch eine leere Zeichenkette erlauben). –

Antwort

0

Die Verwendung der case-insensitive Flag i macht manchmal die Dinge einfacher.

Beachten Sie, dass die Erfassungsgruppe beide OR-Bedingungen einschließt.
Und diese Gruppe ist nicht optional mit einem ? gemacht.

/^(null|[-]?\d+)$/i 

oder ohne i Flagge

/^(null|NULL|[-]?\d+)$/ 
+0

* Jetzt * ist es eine Antwort. Beachten Sie jedoch, dass das Einfügen eines Zeichens in eine Zeichenklasse keinen Sinn ergibt. '[-]?' ist das gleiche wie '-?'. Und ich verstehe nicht ganz die Aussage "Gruppe ist nicht optional mit einem?" ... Es ** ist **. – ClasG

+0

Wenn Sie '/ (\ w +)? /' Möchten, suchen Sie nach 0 oder 1 Wörtern. Es unterscheidet sich von '/ (\ w +) +? /', Wo das '?' Für das faule Matching hinzugefügt wird. Das würde also auch passen, wenn es keine Wörter gibt, daher der Begriff optional. Und das habe ich nicht gemacht, aber das Beispiel in der Frage hat es getan. Die Klammern um '-' zu setzen, ist in diesem Fall nicht wirklich notwendig, also ist es nur eine kleine Vorliebe von mir, Zeichen, die eine Bedeutung in einer Regex haben, zu ecken. Und ich fügte nur "[-]?" Hinzu, weil das Beispiel ein '-?' Hat. Obwohl es wahrscheinlich "[+ -]?" Sein sollte – LukStorms

0

Dies ist die regex Sie wollen: -

Pattern p = Pattern.compile("(?i)((null)*\\d*)*"); 
String s = "null123null"; 
System.out.println(s.matches(p.toString())); 

Ausgang

wahr