Regex pour correspondre à une partie de chaîne, quand correspondance ne contient pas une chaîne spécifique - PCRE grep
-
25-09-2019 - |
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.
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]