2011-01-05 6 views
3

Ich benutze TextWrangler grep, um Suchen/Ersetzen für mehrere Dateien durchzuführen, und habe eine Wand mit dem letzten gefunden/ersetzt, den ich brauche ausführen. Ich muss einen beliebigen Text zwischen "> und der ersten Instanz einer <br /> in einer Zeile übereinstimmen, aber die Übereinstimmung kann nicht die Zeichenfolge [xcol] enthalten. Der Regex-Flavor ist Perl-Compatible (PCRE), daher muss Lookbehind eine feste Länge haben.Regex, um einen Teil der Zeichenfolge zu finden, wenn die Übereinstimmung keine bestimmte Zeichenfolge enthält - PCRE grep

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ünschte Verhalten von regex:
1st Line Spiel"> FooBar <br />
2nd Line keine Übereinstimmung
3. Zeile Spiel"> Hallo Welt <br />
4. Zeile

Der Text zwischen "> und <br /> wird in einer Gruppe erfasst, die mit der Replace-Funktion verwendet wird. Die nächstgelegene ich bekam wurde mit der folgenden Regex mit negativem Look-Ahead, aber das wird die dritte Zeile nicht überein, wie gewünscht:

">((?!.*?\[xcol]).*?)<br /> 

Jede Hilfe oder Ratschläge sehr geschätzt werden. Vielen Dank.

Antwort

3

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 . müssen auch übereinstimmen, entweder aktivieren DOT-ALL (add (?s) vor dem .) oder ersetzen Sie die . durch etwas wie [\s\S]

+0

Dies ist genau das, was ich brauchte. Vielen Dank! – lxbrg

+0

@lxbrg, gern geschehen. Du warst der Lösung verdammt nahe! :) –

Verwandte Themen