Regex pour correspondre à une partie de chaîne, quand correspondance ne contient pas une chaîne spécifique - PCRE grep

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

Question

J'utilise TextWrangler grep pour effectuer de recherche / remplacement sur plusieurs fichiers et se sont heurtées à un mur avec la dernière trouvaille / Replace je dois effectuer. Je dois correspondre à tout texte entre "> et la première instance d'un <br /> en ligne, mais le match ne peut pas contenir la séquence de caractères [xCol]. La saveur d'expressions rationnelles est compatible Perl (PCRE), de sorte lookbehind doit être de longueur fixe.

Exemple Texte à rechercher:

<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>  

Comportement souhaité de regex:
1ère ligne Match ">FooBar<br />
2ème ligne pas de match 3ème ligne Match ">Hello World<br />
4e ligne pas de match

Le texte entre "> et le <br /> sera capturé dans un groupe à utiliser la fonction de remplacement. Le plus proche que je suis utilisait l'expression rationnelle suivante avec anticipation négatif, mais cela ne correspond pas à la 3ème ligne selon vos besoins:

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

Toute aide ou conseils sont appréciés. Je vous remercie.

Était-ce utile?

La solution

Essayer cette regex:

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

A (courte) explication:

">               # 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 />'

Si vous devez faire correspondre les sauts de ligne pour . ainsi, soit activer DOT-ALL (ajouter (?s) avant la .) ou remplacer le . avec quelque chose comme [\s\S]

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top