2010-01-28 1 views
3

У меня есть ситуация, когда в регулярном выражении является чем-то вроде этого: ^b?A+b?$Регулярное выражение: как необязательно соответствовать чему-то в начале или в конце, но не в обоих?

Так bможет матч в начале строки 0 или 1 раз, и Aобязательно матч один или несколько раз. Опять bможет соответствовать в конце строки 0 или 1 раз.

Теперь я хочу изменить это регулярное выражение таким образом, чтобы оно могло соответствовать b либо в начале, либо в конце строки, но не для обоих.

Как это сделать?

ответ

9

Theres хороший «или» оператор в регулярных выражениях, которые вы можете использовать.

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

Это то, что я хотел, спасибо, парни за все ваши ответы – Ngm

+0

+1, это тоже работает, и вы поняли это с первой попытки. :) –

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

Почему это не работает?

+1

Я думаю, он хочет bbAAA _or_ AAAbb. – Bobby

+0

Фактически b может повторяться 0 или 1 раз и не более 1 раза – Ngm

+0

@Ngm: слово «repeat» вводит в заблуждение; посмотрите, как я отредактировал ваш вопрос для лучшего способа выразить вашу цель (надеюсь). @Dan: в дополнение к проблеме «0 или 1» ваше регулярное выражение соответствует «b» как в начале, так и в конце строки, которую OP не хочет. –

2

Попробуйте это:

^(bA+|A+b?)$ 

Это позволяет b в начале, а затем по меньшей мере один A или несколько A с в начале и необязательно b в конце. Это охватывает все возможности и немного быстрее, чем принятый ответ в случае, если он не соответствует, поскольку только один из двух вариантов необходимо протестировать (если A не может начинаться с b).

Просто, чтобы отличаться от других ответов здесь, если выражение А является довольно сложным, но б просто, то вы можете сделать это с помощью отрицательного предпросмотра, чтобы избежать повторений всего выражения для A в своем регулярном выражении:

^(b(?!.*b$))?A+b?$ 

Второй может быть более удобным для чтения, если ваш сложный, но если производительность является проблемой, я бы рекомендовал первый метод.

+0

Теперь '^' применяется только к первой части '' '' и '$' относится только ко второй части. – Amarghosh

+0

@Amarghosh: Исправлено, спасибо .... –

Смежные вопросы