Regex per abbinare parte della stringa, quando partita non contiene una stringa specifica - PCRE grep

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

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.

È stato utile?

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]

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top