В регулярном выражении имеется подшаблон, который соответствует жадным точкам. Это .*
делает невозможным захват красивым, поскольку он уже соответствует .*
. Необязательная группа (beautiful)?
или обязательная группа (beautiful|)
просто не соответствуют нишу (# 1, группа «не участвует») или первое пространство (# 2). Чтобы этого избежать, вам нужно ограничиться чем-либо, кроме красивым до peopleXXX.
Один из способов заключается в использовании tempered greedy token:
(?i)(beautiful)?(?:(?!beautiful).)*(people[a-zA-Z0-9]{2,3})
^^^^^^^^^^^^^^^^^^^
См demo
(?:(?!beautiful).)*
будет соответствовать любому символу, кроме символа новой строки, которая не запускается последовательность beautiful
.
Другой способ заключается в использовании развернутую версию этого закаленное жадного лексемы:
(?i)(beautiful)?[^b]*(?:b(?!eautiful)[^b]*)*(people[a-zA-Z0-9]{2,3})
См another demo
The [^b]*(?:b(?!eautiful)[^b]*)*
матчи любой текст, который не запускается последовательность beautiful
символов (это будет соответствовать другие символы чем b
ноль или более раз ([^b]*
), то любое количество последовательностей b
не следует eautiful
(b(?!eautiful)
), а затем следует ноль или более символов от ей, чем b
.
Примечание: чтобы сделать это регулярное выражение немного более эффективным, вы можете include a check для peopleXXX
:
(?i)(beautiful)?(?:(?!beautiful|people[a-zA-Z0-9]).)*(people[a-zA-Z0-9]{2,3})
и unrolled one:
(?i)(beautiful)?[^bp]*(?:p(?!oeple[a-zA-Z0-9])[^p*]|b(?!eautiful)[^b]*)*(people[a-zA-Z0-9]{2,3})
Спасибо вам так много, это то, что мне нужно. Я буду искать (? :) и (?!) – Benson
Вы должны проверить объяснение [tempered greedy token] (http://www.rexegg.com/regex-quantifiers.html#tempered_greed). Он состоит из группы без захвата ('(?: ...)') и отрицательного lookahead '(?! ...)'. –