2010-01-28 4 views
3

J'ai situation où dans l'expression régulière est quelque chose comme ceci: ^b?A+b?$Regex: Comment optionnellement faire correspondre quelque chose au début ou à la fin, mais pas les deux?

Alors bpeut match au début de la chaîne 0 ou 1 fois, et Adoit correspondre à l'une ou plusieurs fois. Encore bpeut correspondre à la fin de la chaîne 0 ou 1 fois.

Maintenant je veux modifier cette expression régulière de telle sorte qu'elle puisse correspondre à b soit au début ou à la fin de la chaîne, mais pas les deux.

Comment faire?

Répondre

9

Theres un bel opérateur "ou" dans les expressions rationnelles que vous pouvez utiliser.

^(b?A+|A+b?)$ 
+0

C'est ce que je voulais, merci les gars pour toutes vos réponses – Ngm

+0

+1, cela fonctionne aussi, et vous l'avez bien sur la première tentative. :) –

1
^(b+A+b?|b?A+b+)$ 

pourquoi cela ne fonctionne-t-il pas?

+1

Je pense qu'il veut bbAAA _ou_AAAbb. – Bobby

+0

En fait b peut répéter 0 ou 1 fois, et pas plus de 1 fois – Ngm

+0

@Ngm: le mot "répéter" est trompeur; voyez comment j'ai édité votre question pour une meilleure façon d'exprimer votre objectif (j'espère). @Dan: en plus du problème "0 ou 1", votre regex fait correspondre "b" au début et à la fin de la chaîne, ce que l'OP ne veut pas. –

2

Essayez ceci:

^(bA+|A+b?)$ 

Cela permet à un b au début puis au moins un A, ou quelques A s au début et éventuellement un b à la fin. Cela couvre toutes les possibilités et est légèrement plus rapide que la réponse acceptée dans le cas où elle ne correspond pas car une seule des deux options doit être testée (en supposant que A ne peut pas commencer par b). Pour être différent des autres réponses ici, si l'expression A est assez complexe mais b est simple, alors vous pourriez vouloir le faire en utilisant un lookahead négatif pour éviter de répéter l'expression entière pour A dans votre expression régulière:

La deuxième pourrait être plus lisible si votre A est complexe, mais si les performances sont un problème, je recommanderais la première méthode.

+0

Maintenant '^' s'applique seulement à la première partie du '|' et '$' s'applique seulement à la deuxième partie. – Amarghosh

+0

@Amarghosh: Correction, merci .... –

Questions connexes