spamsink: (Default)
spamsink ([personal profile] spamsink) wrote2021-06-14 08:07 pm

Программистский вопрос; возможно, тупой

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



Легко написать регулярное выражение, которое находит строки, содержащие "foo" слева от "bar", и чтобы "qux" было между ними: foo.*qux.*bar (не будем сейчас вдаваться в подробности, как именно распределятся символы строки по этим ".*", если вхождений "foo", "bar" или "qux" в строке несколько).

Вопрос вот в чём: есть ли где-нибудь такое расширение языка регулярных выражений, которое позволило бы компактно записать условие найти строки, содержащие "foo" слева от "bar", и чтобы между ними не было "qux"?

UPD: На самом деле здесь две задачи. Первая: паттерну должны удовлетворять строки /foo(.*)bar/ (т.е. .* захватывает всё между первым вхождением foo и последним вхождением bar в строке), такие, что в захваченной строке не содержится qux; вторая: паттерну должны удовлетворять строки, в которых найдутся такие вхождения foo и bar, между которыми нет qux.

Строка "foo qux foo xxx bar qux bar" не удовлетворяет первому паттерну, но удовлетворяет второму.


Похоже, negative lookahead assertions решают одну из двух задач

Post a comment in response:

This account has disabled anonymous posting.
If you don't have an account you can create one now.
No Subject Icon Selected
More info about formatting