2009-08-18 7 views
3

J'ai une question Regex, je dois reconnaître des jetons dans un texte qui sont comme:Comment reconnaître deux mots différents dans un regex sans regroupement

Foo- suivi soit bar ou baz suivie - puis certains numéros, comme:

Foo-bar-010 
Foo-baz-101 

Je veux alors diviser mes matchs comme: Foo-bar-010 et Foo-baz-101

Mon regex est celui-ci:

(Foo-(bar|baz))-[0-9]+ 

Ce qui est assez cool, mais je ne veux pas définir un groupe pour la clause « bar » ou « baz », car il salit mes résultats.

Une idée pour obtenir ce résultat avec un seul groupe?

+0

FYI, '\ b' ne fait aucun bien dans cette regex. C'est principalement pour quand vous ne savez pas ce qu'est le caractère non-mot - comme quand vous voulez trouver un mot qui pourrait être entouré par des espaces, par la ponctuation, ou par rien du tout. –

+0

Cela fonctionne en effet sans l'ancre \ b. Merci pour le conseil! – Vinzz

+0

Retiré l'ancre \ b, comme conseillé par Alan M – Vinzz

Répondre

8
(Foo-\b(?:bar|baz)\b)-[0-9]+ 

: généralement des drapeaux le groupe comme un match non-capture (en fonction de votre moteur).

+0

Merci, ne connaissait pas cette fonctionnalité. – Vinzz

+0

Excellent. C'est nouveau pour moi aussi. –

1

Je pense que cela fera ce que vous voulez.

Cela renvoie les Foo- et -NNN parties en deux groupes distincts:

(Foo-ba[rz])(-\d+) 

Obtenir le tout retour en un seul groupe peut être fait comme ça.

(Foo-ba[rz]-\d+) 
+0

Oui, accordé, il colle avec les entrées de la question, mais mon problème de cas réel utilise des mots légèrement plus éloignés que bar et baz; o) merci quand même. – Vinzz

Questions connexes