Regex Teil der Zeichenfolge übereinstimmen, wenn keine Übereinstimmung eine bestimmte Zeichenfolge enthält - PCRE grep
-
25-09-2019 - |
Frage
Ich verwende TextWrangler grep finden auszuführen / Ersetzen auf mehrere Dateien und haben in eine Wand mit dem letzten Fund laufen / ersetze ich durchführen müssen. Ich brauche in einer Linie eines beliebigen Text zwischen ">
und der ersten Instanz eines <br />
passe aber das Spiel kann nicht die Zeichenfolge enthält [xcol]. Der Geschmack ist regex Perl-kompatibel (PCRE) so Lookbehind Bedürfnisse sein mit fester Länge.
Beispiel Text suchen:
<p class="x03">FooBar<br />Bar</p>
<p class="x03">FooBar [xcol]<br />Bar</p>
<p class="x06">Hello World<br />[xcol]foo[xcol]bar<br /></p>
<p class="x07">Hello World[xcol]<br />[xcol]foo[xcol]bar<br /></p>
Gewünschtes Verhalten von regex:
1. Zeile Spiel ">
FooBar<br />
2. Zeile keine Übereinstimmung
3. Zeile Spiel ">
Hello World<br />
4. Zeile keine Übereinstimmung
Der Text zwischen ">
und dem <br />
wird in einer Gruppe aufgenommen wird mit der Funktion ersetzen verwendet werden. Die nächstgelegene ich bekam, war die folgende regex mit negativen Lookahead verwenden, aber dies wird die dritte Zeile nicht überein, wie gewünscht:
">((?!.*?\[xcol]).*?)<br />
Jede Hilfe oder Rat wird geschätzt. Vielen Dank.
Lösung
Versuchen Sie, diese Regex:
">((?!\[xcol]).)*<br\s*/>
A (kurz) Erklärung:
"> # match '">'
( # start group 1
(?!\[xcol]). # if '[xcol]' can't be seen ahead, match any character (except line breaks)
) # end group 1
* # repeat group 1 zero or more times
<br\s*/> # match '<br />'
Wenn Sie Zeilenumbrüche für .
auch passen, entweder aktivieren DOT-ALL (Add (?s)
vor dem .
) oder die .
mit so etwas wie [\s\S]
ersetzen