Pourquoi la dernière expression dans mon expression régulière concaténer à la première?

voix
0

La langue est Ruby, voici ma session irb

expr = /\Aselect from (\D+)(?: (?:where|&&) (\D+) (\S+) (\S+))*(?: order by (\D+) (asc|desc))?\Z/
=> /\Aselect from (\D+)(?: (?:where|&&) (\D+) (\S+) (\S+))*(?: order by (\D+) (asc|desc))?\Z/

/> str = select from Entity order by value desc
=> select from Entity order by value desc

/> expr =~ str
=> 0

/> $1
=> Entity order by value desc

/> $2
=> nil

Je ne comprends pas pourquoi je reçois « pour l'entité en valeur desc » $ 1. Le comportement souhaité ici serait d'obtenir 1 $ => entité, 2 $ => valeur, $ 3 => desc. Qu'est-ce que je fais mal? Comment puis-je modifier cette expression régulière si je reçois ces résultats?

Je vous remercie

Créé 27/08/2009 à 02:07
source utilisateur
Dans d'autres langues...                            


2 réponses

voix
4

\ D est « non chiffres », qui couvre les espaces entre les mots, ainsi que les mots suivants. Essayez (\ S +) à la place.

[Modifier] Désolé, j'ai raté la question à la fin. Les réponses ci-dessus le « pourquoi cela se produit? », Mais pas « comment puis-je obtenir ce que je voulais? ». Voici une façon, sans passer par toutes les autres clauses avec. *

/\Aselect from (\S+).*(?:order by (\S+) (asc|desc)?)?\Z/

Puisque SQL est assez libre avec un espacement entre les mots clés et par exemple, vous voudrez peut-être le rendre plus illisible et utiliser \ s + au lieu des espaces littérales. Autrement dit, l'expression-est ne correspondrait pas:

"select   from     Fred"

mais il si vous aviez / \ ASÉLECTIONNER \ s + \ s + ....

Créé 27/08/2009 à 02:12
source utilisateur

voix
1

Le (\D+)est avide et a mangé le reste de la chaîne. Puisque tout le reste dans votre expression est facultative (* ou?) Il n'y a pas besoin de correspondre à l'expression pour réussir.

Ma suggestion est de faire vos matchs moins gourmands. par exemple (\D+?)correspondra et capturer toute non chiffres une ou plusieurs fois, mais aussi peu de fois que nécessaire pour faire un jumelage.

Créé 27/08/2009 à 07:13
source utilisateur

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more