Регулярное выражение, соответствующее первому экземпляру - PullRequest
0 голосов
/ 25 декабря 2018

У меня есть регулярное выражение (.*)?start((?!(foo|boo)).)* end test.*.

Что он делает, так это вернет true, если между start и end test * 1011 нет foo или boo * и ложь в противном случае.Это работает, как ожидалось.Но я столкнулся с проблемой со следующим выражением

start foo again start too anything anything end test

Мой ожидаемый результат неверен, потому что между ними foo.Но похоже, что он не берет первый start.

Ответы [ 2 ]

0 голосов
/ 25 декабря 2018

Tim Biegeleisen ответ отличный, но он не принимает строки, в которых start и end test отсутствуют (пример: abc123 следует принять как условие нетfoo или boo между start и end test соблюдается ).Из вашего вопроса не очевидно, нужны ли вам эти строки или нет.Если вы сделаете это, вы должны изменить регулярное выражение на:

 ^(?:(?!\bstart\b).)*\bstart\b(?:(?!\b(foo|boo)\b).)*\bend test\b.*$|^(?:(?!\bstart\b).)*$|^(?:(?!\bend test\b).)*$

Демо: https://regex101.com/r/492Z5m/2/

0 голосов
/ 25 декабря 2018

Рассмотрите возможность использования этого шаблона:

^(?:(?!\bstart\b).)*\bstart\b(?:(?!\b(foo|boo)\b).)* end test\b.*$

Причиной сбоя текущего регулярного выражения является то, что начальный (.*)?start на самом деле потребляет start foo again, следовательно, обходит отрицательную закаленную точку, которая проверяет, что foo и boo не появляются между ними.Мой подход использует в начале только , если слово не start.Это позволяет вашей логике работать должным образом, и мы можем утверждать, что ни foo, ни boo не появляются между самым первым start и текстом end test.

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

Демо

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