Regex per abbinare parte della stringa, quando partita non contiene una stringa specifica - PCRE grep
-
25-09-2019 - |
Domanda
Sto utilizzando TextWrangler grep per effettuare ricerca / sostituzione su più file e hanno sbattere contro un muro con l'ultima ricerca / sostituzione ho bisogno di eseguire. Ho bisogno di adattarsi a qualsiasi testo tra ">
e la prima istanza di un <br />
in una linea, ma la partita non riesco a contenere la sequenza di caratteri [XCOL]. Il sapore regex è Perl compatibili (PCRE) esigenze lookbehind essere di lunghezza fissa.
Esempio di testo alla pagina di ricerca:
<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>
comportamento desiderato di regex:
1 ° riga incontro ">
FooBar<br />
2 ° riga non può competere
3 ° riga incontro ">
Hello World<br />
4 ° riga non può competere
Il testo tra ">
e <br />
sarà catturato in un gruppo da utilizzare con la funzione di sostituzione. Il più vicino ho ottenuto è stato utilizzando la seguente espressione regolare con lookahead negativo, ma questo non corrisponderà la linea 3, se lo desideri:
">((?!.*?\[xcol]).*?)<br />
Qualsiasi aiuto o consiglio è apprezzato. Grazie.
Soluzione
Prova questo regex:
">((?!\[xcol]).)*<br\s*/>
A (breve) spiegazione:
"> # 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 />'
Se è necessario far corrispondere interruzioni di riga per .
così, abilitare DOT-ALL (add (?s)
prima della .
) o sostituire il .
con qualcosa di simile [\s\S]