Regex Teil der Zeichenfolge übereinstimmen, wenn keine Übereinstimmung eine bestimmte Zeichenfolge enthält - PCRE grep

StackOverflow https://stackoverflow.com/questions/4608492

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.

War es hilfreich?

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top