2016-11-15 4 views
0

ich einige Strings ändern wollen:Regex zu wählen und so zu ersetzen, Muster zu halten

space+cows  --> space + cows 
stupid+rabbit --> stupid + rabbit 

(put spaces around the `+`) 

In Sublime Text 2 habe ich versucht, diese zu verwenden:

Find: \w+\+\w+ 
Replace: \w+ \+ \w+ 

Die Suche nach regex abgestimmt alles gut, aber offensichtlich wurden meine Saiten durch buchstäblich
w+ + w+ ersetzt.

Ein weiteres Beispiel:

Strings: 
bool *foo  --> bool* foo 
int *bar   --> int* bar 

Pattern: 
Find: (bool|int) *(foo|bar) 
Replace: (bool|int)* (foo|bar) 

Result: 
(bool|int)* (foo|bar) 
(bool|int)* (foo|bar) 

Unnötig zu sagen, dass ich die tatsächlichen bool, int, foo und bar wie sie waren, bevor halten wollte.
Ich kann auch nicht nur ­ \* verwenden, um die Strings anzupassen, weil es andere Sachen auswählt, die ich nicht ersetzen möchte; Ich brauche einen Kontext um die tatsächliche ­ \*, um die richtigen Zeichenfolgen auszuwählen. Auf die gleiche Weise kann ich keine Muster wie ­ \*[^ ­ ] verwenden, weil die nicht-Leerzeichen Zeichen nach dem Stern nach dem Ersatz vernichtet werden würde.

Ich reparierte mein Problem von Sublime Text der mehrzeilige Ausgabe verwenden, aber ich bin immer noch fragen: ist es möglich, eine regex so zu verwenden, die Sie von Strings mit „Gruppe von Zeichen“ ohne Abwischen den eigentlichen Inhalt ersetzen die "Gruppe von Charakteren"?

+1

Sie können grundlegende Regex Probleme hier üben: https://regexone.com/lesson/introduction_abcs – MYGz

+0

Das ist großartig, ich werde es mir ansehen. Vielen Dank! – qreon

Antwort

1

Ja, das ist möglich. Der Grund, warum Ihre Ersetzungen nicht funktionieren, ist (wie Sie bemerkt haben), dass Ihr Ersatztext nur ein wörtlicher Text ist; was auch immer du in die Schachtel steckst, ist was ersetzt, was gepasst wurde, wie du erwarten würdest.

Was Sie tun müssen, ist ein RegEx capture dafür verwenden. Was dies bewirkt, ist, dass der Prozessor für reguläre Ausdrücke (in diesem Fall Sublime Text) nicht nur den Test abgleicht, sondern ihn auch für den Ersatz speichert. Dies tun Sie, indem Sie die Teile der Übereinstimmung, die Sie speichern möchten, in Klammern einschließen. Jeder Klammersatz ist ein Capture Group.

Für Ihr Beispiel Ihre regex wird“

(\w+)\+(\w+) 

Der Wert des Spiels in jedem Satz von Klammern in seiner eigenen numerischen Gruppe gespeichert, an einem zu starten. Ein Syntax wie die folgenden zu den expandiert aus Inhalt des ersten Spiels, durch die Plus-Zeichen mit Leerzeichen um ihn herum, gefolgt von dem zweiten Wort gefolgt:

\1 + \2 

Sie können jede Nummer mehrmals verwenden, wenn Sie wollen:

\1 and again \1 and also \2 
+0

Wow, ich bin wirklich überrascht, dass es * möglich ist ... Ich dachte, ich hätte zu viel verlangt. Vielen Dank! – qreon

1

Regex drehen "stupid+rabbit" to "stupid + rabbit"

Find: (\w+)\+(\w+) 
Replace: $1 + $2 

Regex "bool *foo" or "int *bar" into "bool* foo" or "int* bar"

Find: (bool|int) \*(foo|bar) 
Replace: $1* $2 

() zu drehen - Formen Gruppen, die später verwendet werden können. $ 1 ist die erste Gruppe und $ 2 ist die zweite Gruppe.

Verwandte Themen