2010-03-11 6 views
2

Je voudrais accomplir ce que ce (invalide je crois) expression régulière essaie de faire:match tout sauf un sous-modèle

<p><a>([^(<\/a>)]+?)<\/a></p>uniquestring 

correspondent essentiellement tout sauf une balise d'ancrage de fermeture. Simple non gourmand ne contribue pas ici parce que `UniqueString » peut très bien être après une autre balise d'ancrage de fermeture à distance:

<p><a>text I don't <tag>want</tag> to match</a></p>random 
data<p><a>text I do <tag>want to</tag> match</a></p>uniquestring more 
matches <p><a>of <tag>text I do</tag> want to match</a></p>uniquestring 

J'ai donc plus balise entre les balises d'ancrage. Et j'utilise la présence de uniquestring pour déterminer si je veux faire correspondre les données. Donc, un simple non-gourmand finit par tout correspondre à partir du début des données, je ne veux pas à la fin des données que je veux.

Je sais que je suis proche des problèmes les expressions régulières (ou au moins mes connaissances) ne sont pas bonnes à résoudre. Je pourrais juste à travers les données à un analyseur HTML/XML, mais c'est juste une recherche simple (ish).

Existe-t-il un moyen facile de faire cela que je suis juste absent?

Répondre

1

Vous cherchez quelque chose en arrière négatif zéro largeur: c'est-ce que je

(zyx:~) % echo $T 
<p><a>text I don't <tag>want</tag> to match</a></p>random data<p><a>text I do <tag>want to</tag> match</a></p>uniquestring more matches <p><a>of <tag>text I do</tag> want to match</a></p>uniquestring 
(zyx:~) % echo $T | grep -oP '<p><a>((?<!<\/a>).)+<\/a><\/p>uniquestring' 
<p><a>text I do <tag>want to</tag> match</a></p>uniquestring 
<p><a>of <tag>text I do</tag> want to match</a></p>uniquestring 
+0

En effet recherche:

<p><a>((?<!<\/a>).)+<\/a><\/p>uniquestring 

Test! Et je le comprends presque. :-) –

+0

J'aurais utilisé un * lookahead *, pas un lookbehind. À votre façon, il doit parcourir toute la séquence '' avant de réaliser qu'il n'était pas supposé le faire correspondre. '(?! <\/a>)' arrête la correspondance au premier caractère. –

Questions connexes