Regex Соответствует строке, которая косвенно связана двумя строками - PullRequest
0 голосов
/ 02 января 2019

Вот моя абстрактная тестовая строка:

тестовый тест тестовый

синий

тестовый тест тестовый

красный 23

тестовый тест тестовый

серый

тестовый тест тестовый

синий

тестовый тест тестовый

красный 99

тестовый тест тестовый

серый - белый

тестовый тест тестовый

Я пытаюсь сопоставить текст между секундами"синим" и "серо-белым"

В основном я анализирую некоторый код, и мне нужно 2 правила:

1.) Найдите красный цвет, если между "синим" и "серым"

2.) Найдите красный цвет, если между "синим" и "серо-белым" * Я не уверен в порядке строф

Первый не слишком сложный: Ссылка

Но я не могу понять второе правило. Все, что я пытался ... как (? s) (синий) (. *?) (серый (?! \ s + test)) ... по-прежнему соответствует первому «синему», вместо того, чтобы пропускать его

Можно ли превратить (. *?) В ', но только если не содержит "синий"'

Кто-нибудь знает трюк, которого я не знаю?

Ответы [ 3 ]

0 голосов
/ 02 января 2019

Это регулярное выражение (?s)(blue)(.*?)(grey(?!\s+test)) будет соответствовать целой части между первым синим и последним серым из-за отрицательного взгляда (grey(?!\s+test)), который совпадает в середине и не дает отрицательного взгляда.

Что вы можете сделать, это захватить синий, а затем использовать жадное совпадение, чтобы найти последний «красный», за которым следуют 1+ цифр.Затем используйте не жадный шаблон для сопоставления до первого «серо-белого» * ​​1007 *

(?s)(blue).*(red \d+).*?(grey - white)

См. Regex demo

0 голосов
/ 03 января 2019
(?s)(blue).*?(red).*?(grey(?: - blue)?)

Вышеупомянутое регулярное выражение совпадает с ОБАМИ красными ... но мне нужно уметь определить, что есть что (я не могу полагаться на их порядок)

.

ПозвольтеПерепишите мне вопрос для уточнения цели:

Мне нужно два регулярных выражения, я уже нашел ответ для 1.), но ищу ответ для 2.):

1.) Найти «красный XX», если между «синим» и «серым» (совпадение содержит только красный 23 )

2.) Найти «красный ХХ», если между «синим» и «серый - белый "(совпадение содержит только красный 99 )

0 голосов
/ 02 января 2019

Я полагаю, что вы ищете это на основе ваших 2 правил, хотя они не соответствуют вашему регулярному выражению. regex101

(blue).*?[^ ](red) .*?[^ ](grey( | - blue)?)

Совпадение «синий», за которым следует не жадное совпадение чего-либо до следующего «красного» (где красный начинается с начала строки или пробела, исопровождаемый пробелом), сопровождаемый нежадным соответствием чего-либо, пока не следует «серый» (где за серым следует начало строки или пробела), за которым необязательно следует пробел или «- синий».Обеспечение соответствия слова совпадению пробелом исключает ложные совпадения, где «красный» является частью другого слова.

...