Сопоставьте все шаблоны регулярных выражений, пока не будет достигнут шаблон разделения - PullRequest
2 голосов
/ 31 марта 2019

У меня есть следующее регулярное выражение:

\w{6,}(?=(\s|\n)*hello there)

Я пытаюсь сопоставить все шаблоны, пока не будет достигнута строка "hello there".

ASD abc1234 
fegds abc12345 
xyz456 GD (jdkjf)
xyz1234 GD (jdkjf)
(jsdfk) def123 kjfg abc493 

hello there

kjfg feg4493

Кажется, что он соответствует только «abc493», тогда как он должен действительно соответствовать всем 6 шаблонам: "Abc1234", "Abc12345", "Xyz456", "Xyz1234", "def123" и "abc493"

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

Ответы [ 3 ]

2 голосов
/ 31 марта 2019

Если вы хотите перехватить все 6-символьные строки, которые предшествуют hello there, правильное регулярное выражение:

\w{6,}(?=[\s\S]*hello there)

Где [\s\S] означает любой символ, который является пробелом или нет (практически всеэквивалентно (?s).*, если вы хотите использовать однострочный режим ).

См. здесь для демонстрации.

PS ЕслиВы хотите, чтобы hello there был разделителем полной строки, замените его на (?m)^hello there$

2 голосов
/ 31 марта 2019

В PCRE вы могли бы использовать глаголы с возвратом вместо заглядываний, которые в этом сценарии работают лучше:

(?s)hello there.*(*SKIP)(*F)|\w{6,}

См. живое демо здесь

2 голосов
/ 31 марта 2019

Вероятно, это версия вашего текущего паттерна, которую вы намеревались:

\w{6,}(?=[\s\S]*\bhello there\b)

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

Если ваш вариант регулярного выражения поддерживает режим DOT ALL, вы можете использовать следующий шаблон:

\w{6,}(?=.*\bhello there\b)

Вот демонстрационная версия для второй .* версии, которая использует режим DOT ALL, показывающая, что ваши шесть ожидаемых совпадений появляются.

Демо

...