2017-08-21 18 views
0

Ich versuche einen regulären Ausdruck zu schreiben, den ich ein paar Regeln nicht zusammen ketten kann. Ich muss einen Zahlenstring validieren, um zu überprüfen, dass es nicht einigen Regeln entspricht.Regulärer Ausdruck - Wie invertiert man in NOT

Ich muss es:

  1. Nicht mit 3 Nullen
  2. Nicht enden mit 4 Nullen beginnen
  3. nicht alle die gleiche Ziffer sein

Hier ist, was ich versuche so weit:

var re = new RegExp(/^(.)\1{8}$|^000|0000$/); 

re.test("111111111"); // true; all same digit 
re.test("000112222"); // true; starts with zeroes 
re.test("111110000"); // true; ends in zeroes 
re.test("123456789"); // false 
re.test("111223344"); // false 

Dies funktioniert für die fi Die ersten drei Fälle mit TRUE, wie kann ich den Test umkehren, damit er falsch ist, wenn er nicht die 3 Regeln erfüllt?

(ich weiß, ich kann es nur mit einem ! in der JS-Flip, ich bin für eine regex Lösung suchen)

+1

Trennzeichen nicht, wenn Sie Konstruktor verwenden. 'new RegExp ('...')' oder '/.../' – Toto

+0

Sie können ein * negatives Lookahead * verwenden. –

+1

@Toto, können Sie erklären warum? – SoluableNonagon

Antwort

5

Putting alle Regeln zusammen, können Sie diese Regex verwenden:

/^(?!0{3})(?!.*0{4}$)(\d)(?!\1*$)\d*$/gm 

RegEx Demo

RegEx Breakup:

^   # start 
(?!0{3}) # negative lookahead to assert failure when we have 3 0s at start 
(?!.*0{4}$) # negative lookahead to assert failure when we have 4 0s at end 
(\d)  # match a digit and capture in group #1 
(?!\1*$) # negative lookahead to assert we don't have same digit until end 
\d*   # match zero or more digits 
$   # end 
+1

Könnte es wert sein zu erklären, was die verschiedenen Teile sind. –

+0

Ja natürlich, es jetzt hinzufügen. – anubhava

+1

Ehrfürchtig; Danke für die Hilfe – SoluableNonagon