Ich habe diesen Code und möchte wissen, ob ich nur Gruppen (nicht alle Muster) in Java Regex ersetzen kann. Code:
//...
Pattern p = Pattern.compile("(\\d).*(\\d)");
String input = "6 example input 4";
Matcher m = p.matcher(input);
if (m.find()) {
//Now I want replace group one ( (\\d) ) with number
//and group two (too (\\d) ) with 1, but I don't know how.
}
java
regex
replace
regex-group
Wokena
quelle
quelle
Antworten:
Verwenden Sie
$n
(wobei n eine Ziffer ist), um auf erfasste Teilsequenzen in zu verweisenreplaceFirst(...)
. Ich gehe davon aus, dass Sie die erste Gruppe durch die Literalzeichenfolge "number" und die zweite Gruppe durch den Wert der ersten Gruppe ersetzen wollten .Betrachten Sie
(\D+)
für die zweite Gruppe anstelle von(.*)
.*
ist ein gieriger Matcher und verbraucht zunächst die letzte Ziffer. Der Matcher muss dann zurückverfolgen, wenn er feststellt, dass das Finale(\d)
nichts zu entsprechen hat, bevor er mit der letzten Ziffer übereinstimmen kann.quelle
m.replaceFirst("number $2$1");
sollte seinm.replaceFirst("number $3$1");
Sie können eine generische Ersatzmethode verwenden
Matcher#start(group)
undMatcher#end(group)
erstellen:Überprüfen Sie die Online-Demo hier .
quelle
Es tut mir leid, ein totes Pferd geschlagen zu haben, aber es ist irgendwie seltsam, dass niemand darauf hingewiesen hat - "Ja, das kannst du, aber das ist das Gegenteil davon, wie du Gruppen im wirklichen Leben fängst".
Wenn Sie Regex so verwenden, wie es verwendet werden soll, ist die Lösung so einfach:
Oder wie von Shmosel unten zu Recht hervorgehoben,
... da es in Ihrer Regex keinen guten Grund gibt, die Dezimalstellen überhaupt zu gruppieren.
Normalerweise verwenden Sie keine Erfassungsgruppen für die Teile der Zeichenfolge, die Sie verwerfen möchten . Sie verwenden sie für den Teil der Zeichenfolge, den Sie behalten möchten .
Wenn Sie wirklich Gruppen möchten, die Sie ersetzen möchten, möchten Sie wahrscheinlich stattdessen eine Vorlagen-Engine (z. B. Schnurrbart, EJS, StringTemplate, ...).
Abgesehen von den neugierigen, auch nicht erfassenden Gruppen in regulären Ausdrücken sind sie nur für den Fall da, dass die Regex-Engine sie benötigt, um variablen Text zu erkennen und zu überspringen. Zum Beispiel in
Sie benötigen sie, wenn Ihre Eingabe entweder wie "abcabc capture me bcdbcd" oder "abc capture me bcd" oder einfach nur "Capture me" aussehen kann .
Oder anders ausgedrückt: Wenn der Text immer derselbe ist und Sie ihn nicht erfassen, gibt es keinen Grund, überhaupt Gruppen zu verwenden.
quelle
\d(.*)\d
wird genügen.$11
hier nicht. Warum 11?Fügen Sie eine dritte Gruppe hinzu
.*
, indem Sie Parens hinzufügen , und ersetzen Sie dann die Teilsequenz durch"number" + m.group(2) + "1"
. z.B:quelle
"number$21"
funktioniert und"number" + m.group(2) + "1"
nicht.number$21
würde Gruppe 21 ersetzt, nicht Gruppe 2 + die Zeichenfolge "1".Sie können die Methoden matcher.start () und matcher.end () verwenden, um die Gruppenpositionen abzurufen. Mit diesen Positionen können Sie also problemlos jeden Text ersetzen.
quelle
Ersetzen Sie die Passwortfelder aus der Eingabe:
quelle
Hier ist eine andere Lösung, die auch das Ersetzen einer einzelnen Gruppe in mehreren Spielen ermöglicht. Es verwendet Stapel, um die Ausführungsreihenfolge umzukehren, sodass die Zeichenfolgenoperation sicher ausgeführt werden kann.
quelle