2017-04-21 13 views
6

Rozważmy następujący ciąg:Przelotowe RegEx mecze i zastąpić bieżące wystąpienie

zamówił pizzę z anchois. Niestety, nie tego chciał. Poza tym pizza z pieczarkami, pepperoni i anchois jest znacznie lepsza niż zwykła pizza z anchois.

Załóżmy, że musisz zmienić pizza with (ingredients) na pizza with (ingredients) on a thin crust.

Aby to zrobić, ja ustawić regex:

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

Ten oddaje trzy mecze. Potem postępować, aby dodać on a thin crust do każdego meczu stosując następujący kod:

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."); 
} 

Wyjście to będzie wtedy:

Zamówił pizzę z anchois na cienkiej skorupie na cienki Skorupa. Niestety, nie tego chciał. Poza tym pizza z pieczarkami, pepperoni i anchois jest znacznie lepsza niż zwykła pizza z anchois na cienkiej skórze na cienkiej skórze.

Co się stało:

Pierwszy mecz pizza with anchovies jest taki sam jak w ostatnim meczu. Dlatego użycie String.replace spowodowało zmianę pierwszego i ostatniego dopasowania na pizza with anchovies on a thin crust. Ponieważ przechodzimy przez wszystkie mecze, ostatni mecz będzie nadal występował, a funkcja replace zastąpi także pierwsze dopasowanie (ponieważ pierwszy mecz i ostatni mecz są takie same). Dlatego otrzymujemy podwójne on a thin crust.

Q:

Czy istnieje sposób, aby zastąpić mecz Regex tylko przy obecnym meczu?

+0

Jeśli uważasz, że moja odpowiedź jest dla Ciebie pomocna/działająca, rozważ uwzględnienie/zaakceptowanie. –

Odpowiedz

6

zrobić z pojedynczym replaceAll użyciu $0 wstecznych do całego meczu:

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. 

Zobacz Java demo

ten sposób będzie można uniknąć zastępując już zastąpiony tekstów od replaceAll() procesu wszystko, stwardnienie, pokoje - nakładanie się podciągów spełniających twój wzorzec regex.