Używam while(matcher.find())
do zapętlenia wszystkich dopasowań wzorca. Dla każdej instancji lub dopasowania tego wzorca znajduje on, chcę zastąpić matcher.group(3)
z nowym tekstem. Ten tekst będzie inny dla każdego, więc używam matcher.appendReplacement()
, aby odbudować oryginalny ciąg z nowymi zmianami podczas jego przechodzenia. Jednak appendReplacement()
zastępuje cały wzór zamiast tylko grupy.Jak dodaćReplacement w grupie Matchera zamiast całego wzorca?
Jak mogę to zrobić, ale modyfikować tylko trzecią grupę dopasowania, a nie cały wzór?
Oto przykładowy kod:
Pattern pattern = Pattern.compile("THE (REGEX) (EXPRESSION) (WITH MULTIPLE) GROUPS");
Matcher matcher = pattern.matcher("THE TEXT TO SEARCH AND MODIFY");
StringBuffer buffer = new StringBuffer();
while(matcher.find()){
matcher.appendReplacement(buffer, processTheGroup(matcher.group(3));
}
ale chciałbym zrobić coś takiego (oczywiście to nie działa).
...
while(matcher.find()){
matcher.group(3).appendReplacement(buffer, processTheGroup(matcher.group(3));
}
Coś w tym stylu, w którym zastępuje tylko określoną grupę, a nie cały Wzór.
EDYCJA: zmieniono przykład regex, aby pokazać, że nie wszystkie wzory są pogrupowane.
To wielkie dzięki. Czy istnieje również sposób, aby to zrobić, jeśli istnieją pewne aspekty Wzorca, które nie występują w grupach? (Edytowałem przykład mojego oryginalnego wpisu) – cottonBallPaws
Jeśli musisz uwzględnić te części w meczu (tj. Nie możesz ich pominąć), wtedy chcesz je przechwycić w grupie, abyś mógł zapamiętać, co im pasowało i umieścić je z powrotem w niezmienionej formie jako część zamiennika. – polygenelubricants
Należy zauważyć, że to się nie powiedzie, jeśli jeden z dopasowanych łańcuchów zawiera '$'. Zobacz odpowiedź Warrensa poniżej. – Mene