2017-04-21 18 views
6

die folgende Zeichenfolge vor:durch RegEx Looping Spiele und ersetzen Sie das aktuelle Spiel

Er bestellen eine Pizza mit Sardellen. Leider war es nicht das, was er wollte. Außerdem ist Pizza mit Pilzen, Peperoni und Sardellen viel besser als die normale Pizza mit Sardellen.

Nehmen wir an, Sie müssen pizza with (ingredients) zu pizza with (ingredients) on a thin crust ändern.

, das zu tun, hatte ich einen Regex gesetzt:

(?i:pizza with [a-zA-Z,\s]*?anchovies) 

Dies fängt drei Spielen. Dann gehe ich die on a thin crust zu jedem Spiel hinzuzufügen, um den folgenden Code:

Pattern p = Pattern.compile("(?i:pizza with [a-zA-Z,\s]*?anchovies)"); 
Matcher m = p.matcher(string); 
while(m.find()) 
{ 
    string = string.replace(m.group(), m.group() + "on a thin crust."); 
} 

Der Ausgang dieses ist dann:

Er eine Pizza bestellt mit Sardellen auf einer dünnen Kruste auf einem dünnen Kruste. Leider war es nicht das, was er wollte. Außerdem ist Pizza mit Pilzen, Peperoni und Sardellen viel besser als die normale Pizza mit Sardellen auf einer dünnen Kruste auf einer dünnen Kruste.

Was ist passiert:

Das erste Spiel pizza with anchovies das gleiche wie das letzte Spiel ist. Daher führte die Verwendung von String.replace dazu, dass die erste und letzte Übereinstimmung in pizza with anchovies on a thin crust geändert wurde. Da wir alle Übereinstimmungen durchgehen, wird die letzte Übereinstimmung immer noch auftreten und die Ersetzungsfunktion wird auch die erste Übereinstimmung ersetzen (da die erste Übereinstimmung und die letzte Übereinstimmung gleich sind). Daher erhalten wir doppelt on a thin crust.

Q:

Gibt es eine Möglichkeit nur ein Regex Spiel am aktuellen Spiel zu ersetzen?

+0

Wenn Sie meine Antwort hilfreich/für Sie arbeiten finden, bitte erwägen Sie, upvoting/accepting. –

Antwort

6

Do it mit einem einzigen replaceAll$0 Rückreferenzierung auf das gesamte Spiel mit:

String s = "He ordered a pizza with anchovies. Unfortunately, it wasn't the thing he wanted. Besides, pizza with mushroom, pepperoni and anchovies is much better than the normal pizza with anchovies."; 
s = s.replaceAll("(?i)pizza with [a-zA-Z,\\s]*?anchovies", "$0 on a thin crust"); 
System.out.println(s); 
// => He ordered a pizza with anchovies on a thin crust. Unfortunately, it wasn't the thing 
// he wanted. Besides, pizza with mushroom, pepperoni and anchovies on a thin crust is 
// much better than the normal pizza with anchovies on a thin crust. 

die Java demo

Auf diese Weise sehen, vermeiden Sie bereits ersetzt Texte seit replaceAll() Prozess ersetzt alle, mehrfach, nicht überlappende Vorkommen der Teilstrings, die Ihrem Regex-Muster entsprechen.