2009-08-30 8 views
2
/^"((?:[^"]|\\.)*)"/ 

contre cette chaîne:Comment faire correspondre une chaîne entre guillemets avec des guillemets échappés?

"quote\_with\\escaped\"characters" more 

Il correspond seulement jusqu'à la \", bien que je l'ai clairement défini \ comme un caractère d'échappement (et il correspond à \_ et \\ bien ...).

+2

est-il pire question que « ce qui est WRO avec le regex? " - Aucune infraction CX. – Rob

+0

Je sais, à droite: D Qu'auriez-vous intitulé? –

+0

@Rob: cette question devrait-elle être formulée différemment? Ou est-ce que les questions sur les expressions régulières qui ne se comportent pas comme prévu ne sont pas appropriées pour Stack Overflow? –

Répondre

4

Il fonctionne correctement si vous retournez l'ordre de vos deux alternatives:

/^"((?:\\.|[^"])*)"/ 

Le problème est que sinon le personnage important \ se mangé avant il essaie correspondant \". Cela a fonctionné avant pour \\ et \_ seulement parce que les deux caractères dans chaque paire obtiennent assortis par votre [^"].

+0

Erreur simple avec l'ordre des choses, brillant. Merci! –

0

En utilisant Python avec littéraux-chaîne brute pour assurer aucune interprétation supplémentaire de séquences d'échappement est en cours, la variante suivante fonctionne:

import re 

x = re.compile(r'^"((?:[^"\\]|\\.)*)"') 

s = r'"quote\_with\\escaped\"characters" more"' 

mo = x.match(s) 
print mo.group() 

émet "quote\_with\\escaped\"characters"; Je crois que dans votre version (qui interrompt également la correspondance précocement si elle est substituée ici) la sous-expression "not a doublequote" ([^"]) avale les barres obliques inverses que vous avez l'intention d'utiliser comme échappant aux caractères immédiatement suivants. Tout ce que je fais ici, c'est de veiller à ce que de telles contre-balises ne soient pas englouties de cette façon, et, comme je l'ai dit, cela semble fonctionner avec ce changement.

0

Ne pas confondre, juste une autre information avec laquelle j'ai joué. Ci-dessous regexp (PCRE) essayer de ne pas correspondre à mauvaise syntaxe (par exemple fin avec \. ") Et peut utiliser à la fois» ou"

/('|").*\\\1.*?[^\\]\1/ 

à utiliser avec php

<?php if (preg_match('/(\'|").*\\\\\1.*?[^\\\\]\1/', $subject)) return true; ?> 

Pour:

"quote\_with\\escaped\"characters" "aaa" 
'just \'another\' quote "example\"' 
"Wrong syntax \" 
"No escapes, no match here" 

Ce seul match:

"quote\_with\\escaped\"characters" and 
'just \'another\' quote "example\"' 
Questions connexes