2010-01-13 3 views
0

... AA BB BB AA ...Expression régulière récursive, comment faire correspondre la chaîne couplée avec une expression régulière?

AA, BB peut être consécutive chaîne avec arbitraire sans espace en elle.

Mais je veux les outest paire: AA

Plus exemples:

Entrée:

un HH CC abc CC HH c

sortie:

HH

entrée:

x AAAA j DD GG DD Hsu DD GG DD k AAAA o

sortie:

AAAA

?

Pour ma question plus générale, comment faire correspondre une balise spécifique en html avec l'expression régulière que j'ai vu divers messages discuter à ce sujet, mais aucun d'entre eux donnent une réponse par des questions regex.Related sont: I'm looking for a regular expression to remove a given (x)HTML tag from a string

+0

pour la saisie: "x AAAA DD GG hsu JJ JJ AAAA", YYYY est-il une réponse valide? – Nakul

+0

Oui, c'est valide. – user198729

+0

Le second exemple ne suit pas le modèle avec lequel vous commencez. Le second exemple est AA str1 BB str2 BB str3 AA (c'est-à-dire qu'il y a plus qu'un espace blanc entre les chaînes appariées). – Richard

Répondre

0

Je pense que vous avez besoin de références arrière ici. Quelque chose comme (en essayant d'éviter des détails de toute langue regex):

(\w+) \w* (\w+) \w+ \1 \w* \2 

Avec la première capture étant vous résultat.

J'ai supposé un espace unique séparant les cordes pour le garder plus clair, vous avez probablement besoin pour permettre arbitraire avec des espaces \s+ et \w (caractères d'identification: à peu près [a-zA-Z9-0_]) est le bon match pour les cordes.

+0

Pour rendre ma question plus générale, comment faire correspondre une balise spécifique en html avec l'expression régulière? J'ai vu plusieurs articles en discuter, mais aucun d'eux ne donne de réponse par regex.Related questions sont: http: //stackoverflow.com/questions/116403/im-looking-for-a-regular-expression-to-remove-a-given-xhtml-tag-from-a-string – user198729

+0

Regex est, en général, la mauvaise approche à moins que le contexte ne soit substantiellement contraint (par exemple, vous contrôlez la source). Mieux vaut utiliser un analyseur (qui pourrait être un analyseur XML si vous savez qu'il s'agit de XHTML). – Richard

+0

Supposons que j'ai affaire à un truc comme HTML, mais pas exactement html. Ensuite, l'analyseur DOM ne fonctionnera pas. – user198729

1
\b(\w{2,})\b.*\b\1\b 

correspondra à tout de la première série de caractères consécutifs jusqu'à sa répétition. La référence arrière \1 contiendra le motif correspondant (par exemple, AA, HH ou YYYY dans vos exemples).

Les \b s sont nécessaires pour appliquer les limites de mots.

EDIT: Oh. Je viens de remarquer que vous voulez faire quelque chose d'autre, à savoir supprimer les balises HTML d'une chaîne/fichier. Ne pas utiliser des regex pour cela. Je ne vais pas citer l'article que tout le monde cite toujours quand quelqu'un pose une question comme celle-ci, mais le problème (en un mot) est que le HTML n'est pas régulier, et essayer d'utiliser des expressions rationnelles demande juste des ennuis.C'est la raison pour laquelle personne (dans leur bon sens) n'utilise des expressions régulières pour "analyser" le HTML - ils utilisent un analyseur.

Cela dit, je ai utilisés regexes pour extraire des données de sources bien formés XML où je connaissais la structure exactement et je savais que les balises je suis intéressé par ne seraient jamais imbriquées, etc. - mais récursion avec des expressions régulières est juste horriblement compliqué si ça fonctionne du tout (C# et Perl ont un certain soutien pour ça, mais c'est incroyablement poilu).

+0

+1 pour une excellente réponse, et un «merci» sincère pour ne pas lier à The Rant. –

Questions connexes