2010-10-18 14 views
5
someText 
1 
2 
3 
4 
moreText 

Ich möchte ein Präfix vor jeder Ziffer hinzufügen.Eclipse - Regex: Ersetze mehrere Gruppen

aber mit (\w+\R)(\d+\R)+(\w+) und \1prefix\2\3 werden nur die letzte Ziffer vorangestellt und die anderen gelöscht.

Gibt es eine Möglichkeit, es mit einer einzigen Regex zu tun oder sollte ich ein Skript auf der Seite schreiben?

+0

'multiple' oder' mutable'? – leppie

+0

Dies ist eigentlich eine Vereinfachung meiner realen Regex. Aber die Idee ist, dass der Text um die Ziffern mir hilft, den Bereich zu finden, den ich bearbeiten muss. Ich habe viele große Dateien zu bearbeiten und einen Schritt für Schritt durch eine einfachere Regex zu ersetzen würde einige Zeit dauern – Garagos

Antwort

5

Das Problem mit Ihrem Regex ist die Verwendung von gierigen Abgleich in der (\d+\R)+, speziell die letzte +. Das heißt, "passen Sie diese Gruppe so oft wie möglich an, solange sie nicht zum Fehlschuss führt". Also für deinen Text verschlingt er 1, 2, 3 und 4, bevor er nicht mehr verschlingen kann und das letzte Spiel in die zweite Fanggruppe legt. Offensichtlich liegt es in der Natur von Regex-Engines, dass sie nicht in der Lage sind, variadische Gruppen auszudrücken. Wie würden Sie sie überhaupt ansprechen? Also die kurze Antwort, ich denke, dass Regexes das falsche Werkzeug für einen vollautomatischen Prozess sind und Sie ein Skript schreiben müssen.

jedoch für einen etwas weniger automatisierten Prozess, der nach wie vor Ihren umgebenden Text enthält, können Sie

find: (\w+\R)((?:\d+\R)+)(\w+) 
replace: \1prefix\2\3 

versuchen wir die zweite Gruppe wickeln und es ist gierig Modifikator in einem zusätzlichen Satz Erfassung Pars und umschließen die tatsächlichen Anpassungs Text in einer nicht einfangenden Gruppe. Jetzt haben wir den vollständigen Satz von Ziffern in ihrer eigenen Gruppe und können das Präfix dem ersten hinzufügen. Der interessante Nebeneffekt davon ist, dass die erste Nummer dann der ersten Gruppe (\w+\R) entspricht und wenn Sie die Suche/Ersetzung erneut ausführen, trifft sie die nächste Nummer in der Zeile, bis sie nicht mehr übereinstimmt.

Auf diese Weise sollten Sie in der Lage sein, durch Ihre Dateien mindestens nur die Bereiche zu durchlaufen, die Sie dieses Präfix hinzufügen möchten, und es sollte nicht fast so lange dauern wie jede Ziffer in jeder Datei zu finden.