2010-09-23 6 views
0

Je veux être en mesure de détecter/décortiquer les chaînes comme:question Javascript regroupement regex

billets à l'entrée par personne
Ballons pp
plantation d'arbres

-à-dire une description suivie un optionnel "pp" ou "par personne"

J'essaie (.+)\s+(per person|pp) et cela fonctionne; mais le suffixe pp|per person n'est pas facultatif.

J'essaye (.+)\s+(per person|pp)? ou (.+)\s+(per person|pp){0,1} pour le rendre facultatif, mais alors je suis "indéfini pour le deuxième groupe de capture". Curieusement le premier groupe de capture contient la "per":

matches: 0: (billets à l'entrée per)
1: (billets à l'entrée per)
2: (indéfini)

(testé par http://www.regextester.com/ testeur de regex en ligne)

Qu'est-ce que je fais de mal avec ce deuxième groupe de capture?

Répondre

1

Vous pouvez essayer ceci:

^(.+?)\s*(per person|pp|)$ 

Vous pouvez le lire comme ceci:

Starts with 
(any characters but at least one and not in greedy mode) 
any space-characters 
("per person" or "pp" or nothing) 
end 
+0

: Belles œuvres. Je vous remercie ! – user456613

+0

Il s'avère que ce n'est pas tout à fait ce dont on a besoin après tout. Le "caractère espace" requis au milieu ne sera pas présent lorsque la chaîne ne contient pas le suffixe "pp | per person". – user456613

+0

J'ai parlé trop tôt. J'ai essayé ^ (. +) \ S + (par personne | pp |) $ qui fonctionne (notez le \ s + vs le suggéré \ s *), mais nécessite un espace de fin si le | pp par personne pas le suffixe Ainsi, par exemple: « plantation d'arbres » ne sera pas compensée par cette expression régulière, bien que « plantation d'arbres » (notez l'espace de fuite) sera. L'expression régulière que vous avez suggérée: ^ (. +) \ S * (par personne | pp |) $ Ne fonctionne pas parce que le premier groupe est gourmand et renvoie toute la chaîne, par exemple. "ballons par personne" retours 1: (ballons par personne) 2:() au lieu de ce que je veux ce qui est: 1: (ballons) 2: (par personne) – user456613