Как мне написать регулярное выражение для соответствия тексту, содержащему XYZ, но не ABC? - PullRequest
2 голосов
/ 15 января 2009

Я хочу написать регулярное выражение, которое соответствует, если строка содержит XYZ, но не содержит ABC где-то перед ним. Так что "бла XYZ бла" должно совпадать, а "бла ABC бла XYZ бла" не должно.

Есть идеи? В частности, я пишу регулярное выражение в c #, на случай, если есть что-то специфическое для этого синтаксиса.

Полагаю, я могу использовать отрицательный взгляд назад, но не использовал это раньше ...

спасибо!

ОБНОВЛЕНИЕ: мне нужно регулярное выражение, так как у меня нет возможности изменить код, только некоторая конфигурация.

ОБНОВЛЕНИЕ: изменено, так как мне нужно только проверить, что ABC не появляется до XYZ, мне не нужно проверять, появляется ли оно после.

Ответы [ 6 ]

4 голосов
/ 15 января 2009
^(?:(?<!ABC).)*XYZ

было хорошо для моего маленького набора тестов.

2 голосов
/ 16 января 2009

Нет необходимости смотреть назад:

^(?:(?!ABC).)*XYZ
2 голосов
/ 15 января 2009

что-то не так с

 string.Contains("XYZ") && !string.contains("ABC") 
0 голосов
/ 15 января 2009

Это должно работать:

^(?:(?!ABC).{3,})?XYZ

И если оно также не должно появляться после XYZ:

^(?:(?!ABC).{3,})?XYZ(?:.{3,}(?<!ABC))?$
0 голосов
/ 15 января 2009

это должно сделать трюк:

^([^(ABC)]*)(XYZ)(.*)$

некоторые примеры:

sadsafjaspodsa //False
sadABCdsaABCdsa //False
sadABCdsaABCdsaXYZ //False
sadABCdsaABCdsaXYZaa //False
sadABCddasABCsaXYZdsa //False
sadsaXYZdsa //True
sadsaXYZ //True
0 голосов
/ 15 января 2009

Получить Экспрессо . Мое мнение таково, что регулярные выражения трудно освоить, и вы все равно захотите их тщательно протестировать, поэтому лучше всего иметь инструмент, который поможет вам в обоих случаях. Это довольно легко использовать, для этого есть учебники.

Лучшее в этом: он сгенерирует кусок кода C # с вашим регулярным выражением.

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