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?
Jeśli uważasz, że moja odpowiedź jest dla Ciebie pomocna/działająca, rozważ uwzględnienie/zaakceptowanie. –