2012-06-20 8 views
26

Ich versuche, zwei reguläre Ausdrücke, die URIs entsprechen werden. Diese URIs haben das Format: /foo/someVariableData und /foo/someVariableData/bar/someOtherVariableDataJava Regex: Negative Lookahead

Ich brauche zwei Regexe. Jedes muss eins aber nicht das andere zusammenbringen.

Die Regexe, die ich ursprünglich entwickelt habe, sind: /foo/.+ bzw. /foo/.+/bar/.+.

Ich denke, die zweite Regex ist in Ordnung. Es wird nur die zweite Zeichenfolge übereinstimmen. Die erste Regex entspricht jedoch beiden. Also fing ich an (zum ersten Mal) mit negativem Lookahead herumzuspielen. Ich entwarf die regex /foo/.+(?!bar) und den folgenden Code einzurichten es

public static void main(String[] args) { 
    String shouldWork = "/foo/abc123doremi"; 
    String shouldntWork = "/foo/abc123doremi/bar/def456fasola"; 
    String regex = "/foo/.+(?!bar)"; 
    System.out.println("ShouldWork: " + shouldWork.matches(regex)); 
    System.out.println("ShouldntWork: " + shouldntWork.matches(regex)); 
} 

Und natürlich zu testen, beide zu true lösen.

Jeder weiß, was ich falsch mache? Ich muss nicht notwendigerweise negative Lookahead verwenden, ich muss nur das Problem lösen, und ich denke, dass negative Lookahead könnte eine Möglichkeit sein, es zu tun.

Danke,

Antwort

51

Versuchen
String regex = "/foo/(?!.*bar).+"; 

oder möglicherweise

String regex = "/foo/(?!.*\\bbar\\b).+"; 

Ausfälle auf Wegen wie /foo/baz/crowbars zu vermeiden, die ich nehme an, dass regex passen wollen.

Erläuterung: (ohne die doppelten Schrägstriche durch Java-Strings erforderlich)

/foo/ # Match "/foo/" 
(?! # Assert that it's impossible to match the following regex here: 
.* # any number of characters 
\b # followed by a word boundary 
bar # followed by "bar" 
\b # followed by a word boundary. 
)  # End of lookahead assertion 
.+ # Match one or more characters 

\b, der „Wortgrenze Anker“, den leeren Raum zwischen einem alphanumerischen Zeichen und einem nicht-alphanumerischen Zeichen (oder zwischen dem Anfang/Ende der Zeichenfolge und einem Alnum-Zeichen). Daher stimmt es vor dem b oder nach dem r in "bar" überein, aber es stimmt nicht überein zwischen w und b in "crowbar".

Protip: Werfen Sie einen Blick auf http://www.regular-expressions.info - ein großes Regex-Tutorial.