Вместо использования Lookbehind для проверки and
вы можете использовать группу без захвата, как то, что вы делали с запятой:
(?<=by )(\w+ \w+)(?:,\s*)?(\w+ \w+)?(?:\sand\s)?(\w+ \w+)?
Обратите внимание, что вам не нужно добавлять каждый \w+
в группе.
Попробуйте онлайн .
Посмотрите за середину регулярного выражения:
Причина, по которой Lookbehind не будетработа в этом случае заключается в том, что у вас есть это в середине вашего шаблона регулярных выражений.Это не то, как работает Lookbehind.Сопоставление начинается с начала до тех пор, пока не достигает Сзади (например, (?<=prior)subsequent
), оно соответствует тому, что следует за ним (т. Е. subsequent
), затем и только затем ."смотрит за спиной", ожидая найти prior
.Таким образом, в основном за тем, что предшествует Lookbehind, должно следовать то, что следует за (?<=)
(то есть subsequent
), но в то же время , то, что следует за Lookbehind, должно бытьпредшествует то, что внутри него (т. е. prior
).Видите, откуда возникла проблема?
Поэтому, в вашем примере, единственный способ сопоставить полное предложение со взглядом сзади в середине - это также включить and
в шаблон , который делаетВзгляд за резервом .
Для иллюстрации взгляните на это демо .Как видите, шаблон ((?<=and )Person
соответствует Person
, когда он идет после and
.Теперь давайте изменим его на Two (?<=and )Person
, вы, вероятно, подумаете, что он будет работать, но на самом деле не находит совпадений , и это потому, что сначала он ищет Two
, а затем Person
,но он не находит его (потому что «Персона» не следует сразу за «двумя») , поэтому он не переходит к следующему шагу, который является Смотрителем.
Единственныйспособ заставить Lookbehind работать в этом случае, это также включить and
сразу после Two
, как это: Two and (?<=and )Person
, что делает Lookbehind избыточным, как объяснено выше.
Подобное поведение, но для Lookaheads (то есть, когда Lookahead идет посередине) очень хорошо объяснено в этот удивительный ответ be revo.
Надеюсь, это поможет.