Regex: Как опционально сопоставить что-то в начале или конце, но не оба? - PullRequest
3 голосов
/ 28 января 2010

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

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

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

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

Ответы [ 3 ]

9 голосов
/ 28 января 2010

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

^(b?A+|A+b?)$
2 голосов
/ 28 января 2010

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

^(bA+|A+b?)$

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

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

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

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

1 голос
/ 28 января 2010
^(b+A+b?|b?A+b+)$

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...