Qu'est-ce que l'expression regex pour CDATA
Salut j'ai un exemple CDATA ici
<![CDATA[asd[f]]]>
et
<tag1><![CDATA[asd[f]]]></tag1><tag2><![CDATA[asd[f]]]></tag2>
La CDATA regex que j'ai n'est pas en mesure de reconnaître ce
"<![CDATA["([^\]]|"]"[^\]]|"]]"[^>])*"]]>"
cela ne fonctionne pas trop
"<![CDATA["[^\]]*[\]]{2,}([^\]>][^\]]*[\]]{2,})*">"
Quelqu'un merci de me donner une regex pour <![CDATA[asd[f]]]>
, j'ai besoin de l'utiliser dans Lex/Flex
: J'ai répondu à cette question, s'il vous plaît voter sur ma réponse, merci.
Il est difficile de dire si vous avez échappé à la droite breckets. Aussi le xml spécification dit le premier ]]> après le <!CDATA[ mettra fin à l'élément. Donc, tous les thats nécessaires est un non-greedy regex
Vous ne voulez pas utiliser
Et... pourquoi ne pas simplement utiliser un analyseur XML et de travailler avec une arborescence DOM ou SAX-comme des flux d'événements?
Aimerais, sauf que les documents que j'ai reçus ne sont pas strictement XML
/<!\\[CDATA\[.*?\\]\\]>/s
Vous ne voulez pas utiliser
"
n'importe où dans cette RÉ.Et... pourquoi ne pas simplement utiliser un analyseur XML et de travailler avec une arborescence DOM ou SAX-comme des flux d'événements?
Aimerais, sauf que les documents que j'ai reçus ne sont pas strictement XML
OriginalL'auteur Freddy Chua | 2011-01-06
Vous devez vous connecter pour publier un commentaire.
Assez facile, il devrait être ceci:
Au moins il fonctionne sur regexpal.com
Le principal problème est, si j'ai quelque chose comme ceci <abc><![CDATA[asdf]]></abc><abc><![CDATA[asdf]]></abc>. Au-dessus de la REGEX ne reconnaît pas les 2 CDATA
non, bien sûr que non, ce serait terrible. Si vous voulez trouver plusieurs instances d'une chose que vous devez renouveler votre recherche. Comme vous pouvez le voir ici: tinyurl.com/2bztpjn on trouve plusieurs cas, mais pas tous à la fois
Ne fonctionne pas avec flex, c'est manuel (flex.sourceforge.net/manual/Patterns.html) ne sont pas non gourmande de correspondance (ou les assertions avant, une alternative), comme le permet la syntaxe. Vous aurez besoin de démarrer les conditions pour faire un bon travail.
L' ? est le non-greedy opérateur. La différence sera évident si vous avez plusieurs sections. Sans le? il devra sélectionner tout, depuis le début de la première jusqu'à la fin de la dernière section
OriginalL'auteur Sean Patrick Floyd
Le problème est que c'est plutôt difficile à correspondre avec le tri des expressions régulières utilisées dans
lex
; si vous aviez un système pris en charge EREs, alors vous seriez en mesure de faire les deux:ou
(Le premier utilise non-greedy quantificateurs, la seconde utilise anticipation négatif des contraintes. OK, il utilise non-capture de parens trop, mais vous pouvez utiliser la capture de ceux là au lieu de cela, ce n'est pas si important.)
Il est probablement plus facile de gérer cela en utilisant une stratégie similaire à la façon dont C-style commentaires sont traitées dans
lex
, par le fait d'avoir une règle de correspondance le début de la CDATA (sur<![CDATA[
) et de mettre l'analyseur lexical dans un état distinct qu'il laisse sur voir]]>
, tandis que la collecte de tous les caractères dans l'entre-deux. Cette est instructif sur le sujet (et il semble que c'est un domaine oùflex
etlex
différents) et il couvre toutes les stratégies que vous pouvez prendre pour faire ce travail.Noter que la cause de tous ces problèmes, car il est très difficile d'écrire une règle avec des expressions régulières simples qui exprime le fait qu'une gourmande expression régulière ne doit correspondre à un
]
si elle n'est pas suivie par]>
. Il est beaucoup plus facile à faire si vous avez seulement une à deux caractères (ou un seul personnage!) fin-de-intéressant-section séquence parce que vous n'avez pas besoin d'un tel élaborer la machine à état.<![CDATA[asd[f]]]><![CDATA[asd[f]]]>
qui est une amende de stress-test pour vérifier si ces modèles sont vraiment qui correspondent exactement à ce qui est voulu.Oui, je pense que vous comprenez mon problème assez bien. Il semble qu'une seule REGEX expression n'est pas suffisante pour capturer tous les possibles CDATA. Donc je suis en espérant que quelqu'un me donne des instructions sur la façon de capturer CDATA à l'aide de flex/lex de préférence en évitant l'utilisation de yacc ou de bison.
Bien lire la page. C'est sur le problème de l'adaptation des commentaires en C, mais il est doublement s'applique ici aussi.
Dans flex, votre deuxième regex ne permet pas de saisir le contenu (ou du tout). Au moins
<!\[CDATA\[((?:[^]]|\](?!\]>))*)\]\]>
contre<![CDATA[asd[f]]]><![CDATA[asd[f]]]>
ne fonctionne pas sur ce site de testBien sûr, il n'a pas. Flex ne prend pas en charge EREs. Si vous voulez lire tout le reste que j'ai écrit, vous savez déjà...
OriginalL'auteur Donal Fellows
C'est la solution. La raison, nous devons utiliser un ÉTAT de DÉPART est donc que ce n'est jamais entre
<!CDATA[
et]]>
ne pas obtenir des match contre d'autres REGEX.OriginalL'auteur Freddy Chua
Je crois cette autre AFIN de répondre à peut être d'une certaine aide, même si ils retiennent du contenu HTML et est .NET.
Il y a d'autres réponses avec différentes options pour l'accaparement CDATA dans la même question.
Du TCHAD réponse:
Correspondance contre:
extrait:
Selon FlexRegEx de toute façon.
Essayé tous. Ne compile pas en Flex
L'un par le Tchad semble bien fonctionner, du moins pour moi.
Il ne fonctionne pas si je le fais <![CDATA[tsa[f]]]><![CDATA[tsa[f]]]>. Le tchad de la regex reconnaît la CDATA comme un seul CDATA au lieu de deux. J'ai besoin c'est d'être deux CDATA
Je suppose que votre contenu contient
]]>
sein de la chaîne et a besoin d'être sauvé? sinon, ce n'est pas cohérent avec la façon dont CDATA est utilisé.OriginalL'auteur Brad Christie
Une note de recherche pour CDATA devrait exclure les commentaires, CDATA pourrait être intégrée.
/<!(?:\[CDATA\[(.*?)\]\]|--.*?--|\[[A-Z][A-Z\ ]*\[.*?\]\])>/sg
Cela pourrait être fait en vérifiant si le groupe 1 est valide lors de chaque match retourné dans un recherche globale.
Chua - Il fait ce que son supposé faire, donc je suppose que cela fonctionne. Essayez de changer (?: juste (
OriginalL'auteur sln
Previuos réponse juste modifié
OriginalL'auteur Errors