2010-06-30 7 views
1

Hey j'essaie d'utiliser une regex pour compter le nombre de guillemets dans une chaîne qui ne sont pas précédés d'une barre oblique inverse .. par exemple la chaîne suivante:compter les citations dans une chaîne qui n'ont pas de barre oblique inverse avant elles

  • "\"Some text
  • "\"Some \"text

Le code j'utilisais déjà String#count('"') évidemment ce n'est pas assez bon

Quand je compte les citations sur ces deux exemples que je dois le résultat que d'être 1

je cherche ici pour des questions similaires et Ive essayé d'utiliser mais ne peut pas assertions arrières les amener à travailler en rubis.

J'ai essayé les regexs suivantes sur Rubular de cette previous question

  • /[^\\]"/
  • ^"((?<!\\)[^"]+)"
  • ^"([^"]|(?<!\)\\")"

Aucun d'entre eux me donner les résultats im après

Peut-être qu'une regex n'est pas la façon de le faire. Peut-être une approche programatic est la solution

+1

Ruby (jusqu'à 1,8) ne supporte pas lookbehind, qui est probablement la raison pour laquelle il ne fonctionne pas. –

Répondre

2
result = subject.scan(
    /(?:  # match either 
    ^  # start-of-string\/line 
    |   # or 
    \G  # the position where the previous match ended 
    |   # or 
    [^\\]  # one non-backslash character 
    )   # then 
    (\\\\)* # match an even number of backslashes (0 is even, too) 
    "   # match a quote/x) 

vous donne un tableau de tous les guillemets (éventuellement avec un caractère de citation précédent) sauf ceux qui ne le sont pas.

L'ancre \G est nécessaire pour correspondre à des citations successives, et la (\\\\)* veille à ce que les antislashs ne sont comptés que l'échappement des caractères si elles se produisent en nombre impair avant la citation (pour prendre de mise en garde correcte Amarghosh en compte).

+0

+1 pour \ G C'est le bit que j'ai été absent dans ma tentative – sepp2k

+0

retourne un tableau de nils cependant le nombre de nils est le nombre de citations de sorte que son parfait, grâce ' ' "\" foo \ "bar"' scan (/ (:.?^| \ G | [^ \\]) (\\\ \) * "/ x) .size => 2' – Rob

3

Que diriez-vous string.count('"') - string.count("\\"")?

+0

Eh bien, je n'ai jamais pensé à faire ça, ça marche. Je pense que ça va faire. :) – Rob

+1

+1 pour la pensée droite et simple. – Amarghosh

+0

Désolé, mais je ne comprends pas comment cela peut fonctionner, car 'count (« \\ »") 'compte le nombre de backslash plus le nombre de guillemets doubles, chacun pris indépendamment. Je quelque chose épais comme' string.count (.... '"') - string.scan (/ \\" /) count' serait un meilleur travail – JPG

Questions connexes