2016-06-11 16 views
0

Ich habe eine Frage: Ich habe diesen Satz für Beispiel:Regex Spiel Wort, das einen Punkt umfassen

"HalloAnna daveca.nn dave anna ca. anna" 

Und ich will nur die einzige Standing Match „ca.“ .

Mein RegEx ist wie folgt aus:

(?i)\b(ca\.)\b 

Aber das funktioniert nicht, und ich weiß nicht, warum. Irgendwelche Ideen ?

// aktualisieren

ich excecute es mit:

testSource.replaceAll() 

und mit

pattern.matcher(testSource).replaceAll(). 

beide nicht funktioniert.

+0

Wie führe ich diese Regex in Java-Code? –

Antwort

1

Sie sollten es wie folgt verwenden:

Pattern.compile("(?i)\\b(ca\\.)(?=\\W)").matcher(a).replaceAll("SOME TEXT"); 

Welche, wenn Sie die Java-Fluchten gibt einen regulären Ausdruck weglassen: (?i)\b(ca\.)\W.

Alle \ in normalen Regex muss in Java maskiert werden - \\.

Auch vor einem Wort haben Sie Wortgrenze (\b), aber es gilt nur für einen Teil in String, wo Sie eine Änderung von Leerzeichen zu einem alphanumerischen Zeichen oder umgekehrt haben. Aber in Ihrem Fall haben Sie einen Punkt, der kein alphanumerisches Zeichen ist, so dass Sie \b am Ende nicht verwenden können. Sie können \W verwenden, was bedeutet, dass ein Nicht-Wort-Zeichen dem Punkt folgt. Aber um \W zu verwenden, müssen Sie es in der Erfassungsgruppe ignorieren (so wird es nicht ersetzt) ​​- (?=.

Ein weiteres Problem war, dass man . verwendet, die alle Zeichen übereinstimmt, aber Sie wollen tatsächlich den realen Punkt übereinstimmen, so zu tun, dass Sie es entkommen müssen - \., die in Java-String \\. wird.

+0

Das funktioniert perfekt! Aber ich verstehe nicht, was eine Nichtwortgrenze bedeutet? Können Sie bitte den Unterschied zwischen \ b und \ B erklären? – Montezuma

2

Sie müssen entkommen den Punkt und behaupten, ein nicht-Wort folgende:

(?i)\bca\.(?=\W) 

live demo See.