2010-08-05 5 views
1
price:(?:(?:\d+)?(?:\.)?\d+|min)-?(?:(?:\d+)?(?:\.)?\d+|max)? 

Cette expression régulière correspond correctement aux exemples suivants.Comment continuer une correspondance dans Regex

price:1.00-342 
price:.1-23 
price:4 
price:min-900.00 
price:.10-.50 
price:45-100 
price:453.23-231231 
price:min-max 

Maintenant je veux l'améliorer pour correspondre à ces cas.

price:4.45-8.00;10.45-14.50 
price:1.00-max;3-12;23.34-12.19 
price:1.00-2.50;min-12;23.34-max 

Actuellement, la correspondance s'arrête au point virgule. Comment puis-je faire répéter l'expression régulière à travers les séparateurs de deux points?

Solution finale:

price:(((\d*\.)?\d+|min)-?((\d*\.)?\d+|max)?;?)+ 
+1

Nous avons besoin d'un peu plus de contexte à ce que vous * ne * voulez faire correspondre. L'expression rationnelle '^. * $' Correspondra à tous les exemples que vous avez donnés. En général, cependant, vous pouvez ajouter ';?', Créer un groupe non-capturant autour de tout après "price:" et ajouter '*' – Jay

+0

Votre expression régulière correspond également à "price: minmax" et "price: 1.2.3" . Est-ce vraiment ce que tu veux? –

Répondre

1

Ajouter un optionnel; à la fin, et faire tout le modèle pour correspondre à un ou plusieurs:

price:((?:(?:\d+)?(?:\.)?\d+|min)-?(?:(?:\d+)?(?:\.)?\d+|max)?;?)+

+0

Juste ce que je cherchais, merci! –

1

D'abord, il y a quelques problèmes avec l'expression régulière: pour correspondre xx.yyy au lieu de l'expression (?:\d+)?(?:\.)?\d+ vous pouvez utiliser cette (?:\d*\.)?\d+. Cela ne peut correspondre que d'une seule façon afin d'éviter les retours en arrière inutiles.

Votre expression rationnelle correspond actuellement à des éléments tels que price:minmax et price:1.2.3 que je suppose que vous ne voulez pas faire correspondre. La manière simple de répéter votre correspondance est d'ajouter un point-virgule et ensuite de répéter votre expression régulière verbatim.

Vous pouvez le faire comme ceci mais pour éviter d'écrire sur l'ensemble deux fois régulier:

price:(?:(?:(?:\d*\.)?\d+|min)(?:-(?:(?:\d*\.)?\d+|max))?(?:;|$))* 

Voir en action sur Rubular.

+0

Pourquoi ne peut-il pas simplement dire "ou plus de ceux-ci"? – zebediah49

+0

@ zebediah49: Parce qu'il n'y a pas de syntaxe dans les expressions régulières pour "ajouter un séparateur, puis refaire la même chose". :( –

+1

'(?: (?: | $)) +'? – Amber

0
price:((?:(?:\d+)?(?:\.)?\d+|min)-?(?:(?:\d+)?(?:\.)?\d+|max)?;?)+ 

Je ne suis pas sûr de ce qui se passe avec tous les? S '(Je sais que la syntaxe, je ne sais pas pourquoi vous utilisez tellement), mais cela ne devrait le faire pour vous .

+0

Juste une note: Pour la chaîne 'prix: min-maxmax' cela correspond à 'prix: min-max' qui pourrait ou non être ce que l'OP veut (il n'a pas spécifié) –

1

(?:\d+)? est la même chose que \d* et (?:\.)? peut juste être \.?. Simplifié, votre regex d'origine est:

price:(?:\d*\.?\d+|min)(?:-(?:\d*\.?\d+|max))? 

Vous avez deux choix. Vous pouvez soit faire price([:;]range)*plage est la regex vous avez pour les gammes de numéros correspondants, ou être plus précis sur la ponctuation, mais doivent écrire gamme deux fois et faire price:range(;range)*.

price([:;]range)*  -- shorter but allows first ':' to be ';' 
price:range(;range)* -- longer but gets colon vs semi-colon correct 

Choisissez l'un de ces deux expressions rationnelles:

price[:;](?:\d*\.?\d+|min)(?:-(?:\d*\.?\d+|max))? 
price:(?:\d*\.?\d+|min)(?:-(?:\d*\.?\d+|max))?(?:(?:\d*\.?\d+|min)(?:-(?:\d*\.?\d+|max))?)* 
Questions connexes