Я хочу найти способ написать регулярное выражение для поиска вхождений строки, которая начинается с указанной начальной подстроки и заканчивается другой указанной конечной строкой, но общая длина которой минимальна. Например, если моя начальная строка была bar
, а моя конечная строка была foo
при поиске по строке barbazbarbazfoobazfoo
, то я бы хотел, чтобы она возвращала barbazfoo
.
Я знаю, как это сделать, если бы это был просто один символ на одном конце или другом, например, при замене слов выше на символы, которые я мог бы искать, используя a[^a].*?b
, чтобы найти строку axb
внутри строки axaxbxb
, но так как я ищу слова, а не символы, я не могу просто сказать, что не хочу какой-либо конкретной буквы, поскольку букве разрешено появляться между ними.
Для контекста я пытаюсь прочитать журналы с сервера и хотел бы найти, например, какие пользователи столкнулись с определенной ошибкой, но есть дополнительная информация между тем, где появляется имя пользователя и где происходит информация об исключениях. Таким образом, я не ищу решение, которое использует тот факт, что foo
в приведенном выше примере имеет только вхождения букв f
и o
.
Дополнительный пример: из первого абзаца это руководство по регулярным выражениям о предвидении и предвидении
Текст гласит:
Lookahead and lookbehind, collectively called "lookaround", are zero-length assertions just like the start and end of line, and start and end of word anchors explained earlier in this tutorial. The difference is that lookaround actually matches characters, but then gives up the match, returning only the result: match or no match. That is why they are called "assertions". They do not consume characters in the string, but only assert whether a match is possible or not. Lookaround allows you to create regular expressions that are impossible to create without them, or that would get very longwinded without them.
Если мое начальное слово было lookaround
, а мое конечное слово было match
, тогда я ожидаю найти подстроку lookaround actually match
, отмечая, что потенциально могут быть несколько вхождений целевых слов и неизвестное количество слов и символов. между ними возможно разделение символов с целевыми словами. В приведенном выше примере, например, lookaround[^lookaround]*?match
возвращается как не найденное совпадение, поскольку синтаксис, похоже, стремится избежать каждой из букв l
, o
, k
, ... по отдельности. Я смотрю, чтобы увидеть, как это можно сделать, чтобы избежать подстрок, а не отдельных букв.