Java-RegEx, das zu allem passt, aber Literal-String 'NIL' oder 'Nil'

8

OK, Leute. Hier ist eine Frage im Java-Interview-Typ, die einige sehr kluge Leute hier rumgestolpert zu haben scheint. Sie brauchen das eigentlich für den Produktionscode, also ist es mehr als nur ein Interviewrätsel.

Sie benötigen einen regulären Ausdruck in Java, der true zurückgibt, wenn ein String-Literal anders als das aus drei Buchstaben bestehende Wort NIL irgendetwas ist. Der Test muss zwischen Groß- und Kleinschreibung unterscheiden, und die RegEx selbst muss die ganze Arbeit machen.

Die RegEx sollte also NIL, nil, NiL, nIL und so weiter ablehnen.

Es sollte jedoch akzeptiert werden: nile, anil, will, zappa-nil-a und die leere Zeichenfolge.

Wie viele Java-Entwickler braucht man, um eine triviale RegEx zu schreiben? Anscheinend viel!

    
Armchair Bronco 20.04.2012, 23:23
quelle

2 Antworten

18

Sie können dies mithilfe eines Andrew Clark 20.04.2012, 23:26

quelle
5

Hier ist ein wahrer regulärer Ausdruck dafür, der direkt einen endlichen Automaten spezifiziert, der die Zeichen der Kette einzeln durchlaufen kann und einen Akzeptanzzustand erreicht, wenn die Zeichenfolge keine Variante von NIL ist:

%Vor%

Dies funktioniert bei klassischen Regex-Engines, die keine Look-Around-Hacks implementieren und zu einem blitzschnellen DFA konvertiert werden können.

Möglicherweise müssen Sie dies mit ^ und $ verankern, je nachdem, welche Art von Regex-Funktion Sie verwenden: (Ganzer String) Übereinstimmung mit Semantik oder Teilstringsuche Semantik.

Zum Beispiel, grep test:

%Vor%

Die Idee ist hier:

  1. Alle Zeichenfolgen der Länge Eins, Zwei oder Vier oder mehr stimmen überein.
  2. Eine dreistellige Zeichenfolge stimmt genau dann überein, wenn:
    1. Es beginnt nicht mit einem N oder n; oder
    2. Es hat kein Ich oder Ich in der Mitte; oder
    3. Am Ende hat es kein L oder l.

Wie NIL und Nil abgelehnt werden, ist, dass sie alle drei Regeln 2.1, 2.2 und 2.3 nicht erfüllen. NIL beginnt mit einem N, also scheitert es 2.1. Es hat ein I in der Mitte, so dass es 2.2, und es hat ein L am Ende, so dass es 2.3 fehlschlägt.

    
Kaz 21.04.2012 04:12
quelle

Tags und Links