Программистский вопрос; возможно, тупой
Jun. 14th, 2021 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 решают одну из двух задач
Приглашаются также продвинутые пользователи текстовых редакторов, ворд-процессоров и т. п., знающие магический смысл сочетания .* в строке поиска по тексту.
Легко написать регулярное выражение, которое находит строки, содержащие "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 решают одну из двух задач
no subject
Date: 2021-06-15 03:27 am (UTC).* придется убрать.
foo[^q](q[^u](qu[^x]*)?)?bar
Ну, может, скобок убавить.
no subject
Date: 2021-06-15 03:35 am (UTC)И что, ни одна сука до сих не придумала нормального макроса для сокращённой/безошибочной записи этого уродства? Мало ли, может, у меня вместо qux слово из пятнадцати букв.
no subject
Date: 2021-06-15 03:49 am (UTC)О блин. Ну да, после закрывающей квадратной скобки.
А что делать, что делать. Мы ж изготовляем конечный автомат.
no subject
Date: 2021-06-15 03:54 am (UTC)А если надо написать, чтобы не было ни qux, ни yabba, то это же сдохнуть можно будет руками писать.
no subject
Date: 2021-06-15 05:13 am (UTC)no subject
Date: 2021-06-15 05:12 am (UTC)no subject
Date: 2021-06-15 04:29 am (UTC)might work (haven't tested).
no subject
Date: 2021-06-15 04:41 am (UTC)no subject
Date: 2021-06-15 06:22 am (UTC)foo xxx bar qux bar
а должно.
no subject
Date: 2021-06-15 08:40 am (UTC)> x = /foo((?!qux).)*bar/ /foo((?!qux).)*bar/ > x.test('foo bar') true > x.test('foo qux bar') false > x.test('foo xxx bar qux bar') truemay be language specific, eg "?!" not implemented?$ python3 Python 3.9.4 (default, Apr 5 2021, 01:49:30) [Clang 12.0.0 (clang-1200.0.32.29)] on darwin Type "help", "copyright", "credits" or "license" for more information. >>> import re >>> x = re.compile('foo((?!qux).)*bar') >>> x.match('foo bar') <re.Match object; span=(0, 7), match='foo bar'> >>> x.match('foo qux bar') None >>> x.match('foo xxx bar qux bar') <re.Match object; span=(0, 11), match='foo xxx bar'>no subject
Date: 2021-06-15 05:30 am (UTC)Вообще у меня что-то из такого таки работало, но не помню, что, где и в насколько частном случае https://stackoverflow.com/q/2404010/539470
Тред не читал @ сразу отвечал
no subject
Date: 2021-06-15 06:28 am (UTC)no subject
Date: 2021-06-15 08:02 pm (UTC)Is there a reason, like a specification for regex with negative lookahead? Javascript and python work just fine for foo xxx bar qux bar.
no subject
Date: 2021-06-15 06:36 am (UTC)no subject
Date: 2021-06-15 07:09 am (UTC)В апдейте я уточнил про две разные задачи, и хочется чего-то вроде foo(*!qux)bar в первом случае (просто звёздочка захватывает максимальную длину) и foo(*?!qux)bar во втором (звёздочка-вопрос захватывает минимальную длину). Именно с захватом, а не assertion. Такого я не видел.
no subject
Date: 2021-06-15 07:49 pm (UTC)Вместо ß можно использовть что-нибудь более экзотическое, если текст на немецком.
no subject
Date: 2021-06-15 08:56 pm (UTC)