Как использовать регулярное выражение для сопоставления строки с одним шаблоном, но не с другим шаблоном? - PullRequest
2 голосов
/ 14 сентября 2011

Мне нужно определить, соответствует ли строка одной подстроке, а не другой. Например, учитывая подстроки «john» и «mary», где «john» должен присутствовать, а «mary» не должен:

"Меня зовут Джон" -> соответствует

"Меня зовут Мэри" -> нет совпадений

"Их зовут Джон и Мэри" -> нет совпадений

Обратите внимание, что две строки не являются взаимозаменяемыми, "john" - это всегда та, которую нужно сопоставить, и "mary" никогда не должна совпадать, поэтому это не простая операция XOR

Ответы [ 2 ]

3 голосов
/ 14 сентября 2011

Вот ваше регулярное выражение:

^(?!mary)(.(?!mary))*john(?!mary)(.(?!mary))*$

Хорошо, я объясню это, так как ваш вопрос был "как".:) ^ отмечает начало.
(?!mary) - это негативная перспектива.Это соответствует, если нет "Мэри" в текущей позиции.После этого любой персонаж, за которым не следует «Мэри», съедается, пока не будет достигнут «Джон».Затем вся проверка Мэри повторяется до конца, который отмечен знаком доллара.

2 голосов
/ 14 сентября 2011

Почему бы вам не разбить эту проблему на две части?

  • проверить, встречается ли john в строке.Если он присутствует, продолжайте.В противном случае верните false
  • , теперь проверьте, встречается ли mary в строке.Если он присутствует, верните false, в противном случае true

Теперь объедините оба теста в один метод.

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