Ich verwende eine while(matcher.find())
, um durch alle Übereinstimmungen eines Musters zu durchlaufen. Für jede gefundene Instanz oder Übereinstimmung dieses Musters möchte ich matcher.group(3)
durch etwas neuen Text ersetzen. Dieser Text wird für jeden anders sein, also verwende ich matcher.appendReplacement()
, um die ursprüngliche Zeichenfolge mit den neuen Änderungen neu zu erstellen, während es durchgeht. appendReplacement()
ersetzt jedoch das gesamte Muster anstelle nur der Gruppe.Wie kann man Replacement in einer Matcher-Gruppe anstelle des gesamten Musters anhängen?
Wie kann ich das tun, aber nur die dritte Gruppe der Übereinstimmung und nicht das gesamte Muster ändern? Hier
ist einige Beispiel-Code:
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));
}
aber ich möchte so etwas tun (natürlich funktioniert dies nicht).
...
while(matcher.find()){
matcher.group(3).appendReplacement(buffer, processTheGroup(matcher.group(3));
}
So etwas, wo es nur eine bestimmte Gruppe ersetzt, nicht das ganze Muster.
BEARBEITEN: Das Regex-Beispiel wurde geändert, um anzuzeigen, dass nicht alle Muster gruppiert sind.
Das ist großartig danke. Gibt es auch eine Möglichkeit, dies zu tun, wenn einige Aspekte des Musters nicht in Gruppen sind? (Ich habe das Beispiel meines ursprünglichen Posts bearbeitet.) – cottonBallPaws
Wenn Sie diese Teile in das Match aufnehmen müssen (dh Sie können sie nicht aus dem Muster entfernen), dann möchten Sie sie in einer Gruppe erfassen, damit Sie sich daran erinnern können, was sie gefunden haben und legen Sie sie unverändert als Teil Ihres Ersatzes zurück. – polygenelubricants
Beachten Sie, dass dies fehlschlägt, wenn eine der übereinstimmenden Zeichenfolgen ein '$' enthält. Siehe Warrens Antwort unten. – Mene