2009-02-27 12 views
1

J'espérais que quelqu'un pourrait m'aider à écrire une expression rationnelle pour C++ qui correspond à des mots dans une phrase de recherche, et l'expliquer petit à petit à des fins d'apprentissage.expression régulière pour scinder la phrase de recherche

Ce que je dois est une expression régulière qui correspond à chaîne dans " " comme "Hello you all", et les mots simples qui commence/se termine par * comme *ack/overfl*.

Pour la partie quote, j'ai \"[\^\\s][\^\"]*\" mais je n'arrive pas à comprendre la partie générique (*), et comment je devrais la combiner avec l'expression regex.

+0

« Je sais, je vais utiliser regex. » Maintenant, ils ont deux problèmes ... –

+0

"Je sais, je vais citer une citation sur regex." Maintenant, l'auteur a trois problèmes parce que personne ne lui dit POURQUOI ne pas utiliser regex! (Rien d'Adam personnel, cette citation est trop utilisée IMO.) –

+0

@LFSR Consulting: Merci. – Tomalak

Répondre

0

Essayez cette expression régulière:

(?:\*?\w+\*?|"(?:[^\x5C"]+|\x5C(?:\x5C\x5C)*")*")+ 

Pour faciliter la lecture, je remplace les caractères backslash par \x5C.

L'expression "(?:[^\x5C"]+|\x5C(?:\x5C\x5C)*")*" correspond également à "foo \"bar\"" et à d'autres séquences correctes de guillemets échappés (mais seul le " risque d'être échappé).

Alors foo* bar *baz *quux* "foo \"bar\"" devrait être découpé en:

  • foo*
  • bar
  • *baz
  • *quux*
  • "foo \"bar\""

Si vous ne voulez pas correspondre bar dans l'exemple ci-dessus, utilisez ceci:

(?:\*\w+|\w+\*|"(?:[^\x5C"]+|\x5C(?:\x5C\x5C)*")*")+ 
+0

Je suis désolé de le dire, mais votre première regex ne fonctionne pas. Il semble correspondre à chaque mot: "Ceci est une" chaîne de test "', bien qu'elle doive correspondre à' 'chaîne de test' 'seulement. – Tomalak

+0

Je l'avais avant, mais je pensais qu'il aurait aussi envie de faire correspondre ces mots. Voyons voir ce que dit Qwark. – Gumbo

+0

Vel c'est lundi matin et je dois tester la regex au travail, et cela a fonctionné plus que j'espérais. =), Merci. – Qwark

0

Tant qu'il n'y a pas de nidification de citation (imbrication en général est quelque chose regex est mauvais à):

"(?:(?<=\\)"|[^"])*"|\*[^\s]+|[^\s]+\* 

Cette regex permet des guillemets doubles échappées ('\"'), bien que, si vous avez besoin que. Et le match comprend les guillemets doubles.

Cela correspond regex:

  • "A string in quotes, possibly containing \"escaped quotes\""
  • *a_search_word_beginning_with_a_star
  • a_search_word_ending_with_a_star*
  • *a_search_word_enclosed_in_stars*

Sachez qu'il se brisera à cordes comme ceci:

  • A broken \"string "with the quotes all \"mangled up\""

Si vous attendez (lire: ne peut pas exclure complètement la possibilité) pour obtenir ceux-ci, s'il vous plaît ne pas utiliser regex, mais écrire un petit analyseur de devis au courant. Pour une activité de recherche et de remplacement en une seule fois ou entrée dans un format garanti, l'expression régulière est acceptable.

Pour valider/analyser l'entrée de l'utilisateur, il est déconseillé d'utiliser. C'est là que je recommanderais un analyseur. Connaître la différence est la clé.

Questions connexes