Условный просмотр регулярного выражения с последующим совпадением группы захвата PCRE

Я искал ответ и ничего не нашел по этому поводу.
надеюсь, что вы можете помочь мне с моим вопросом.

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

Смотрите мое регулярное выражение в использовании здесь

(?:((?(?=ls)yes|no))\${(?:(?P<type>VAR)\s+)([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)\s*\=\s*(\$\{CALL\s+[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*\s*\}|\"[^\"]*\"|'[^']*'|[0-9]*|(?:[fF]alse|[tT]rue))\s*\}(?<ls>[^\s]{1}))

Входные данные:

    ${VAR foo="What"}x

${VAR foo="What"}

yes${VAR foo="What"}

no${VAR foo="What"}x

Как вы видите, он фиксирует слово «нет», если в конце есть что-то, пока это не \ s, но он не фиксирует слово «да», если это ничего.

0

Решение

Ваш шаблон содержит (?(?=ls)yes|no) который буквально смотрит вперед для персонажей ls, Я изменил ваш шаблон, чтобы использовать DEFINE конструкция для повторного использования подшаблона. Насколько я знаю, у PCRE нет метода, чтобы проверить, была ли определена группа после условный. Это может быть достигнуто в с использованием балансировочных групп, но PCRE не использует эти методы. PCRE имеет (?(name)yes|no) или же (?(1)yes|no) условный, но он не работает для прямых ссылок (по сравнению с проверкой, существует ли переменная еще до того, как она объявлена).

Смотрите регулярное выражение в использовании здесь

(?(DEFINE)
(?# var )
(?<var>[a-zA-Z_\x7f-\xff][\w\x7f-\xff]*)
(?# val )
(?<val>(?&call)|(?&str)|(?&num)|(?&bool))
(?<call>\$\{CALL\s+[a-zA-Z_\x7f-\xff][\w\x7f-\xff]*\s*\})
(?<str>"[^"]*"|'[^']*')
(?<num>\d+)
(?<bool>(?i)(?:false|true)(?-i))
)
((?(?=yes\${VAR\s+(?&var)\s*\=\s*(?&val)\s*\}\s)yes|no))
\${(?P<type>VAR)\s+((?&var))\s*\=\s*((?&val))\s*\}(\S)?

Не дублируя подшаблон в положительном виде, вы можете использовать следующее (как видно в использовании здесь). Знак (?8) рекурсоры 8-й группы захвата:

(?(DEFINE)
(?# var )
(?<var>[a-zA-Z_\x7f-\xff][\w\x7f-\xff]*)
(?# val )
(?<val>(?&call)|(?&str)|(?&num)|(?&bool))
(?<call>\$\{CALL\s+[a-zA-Z_\x7f-\xff][\w\x7f-\xff]*\s*\})
(?<str>"[^"]*"|'[^']*')
(?<num>\d+)
(?<bool>(?i)(?:false|true)(?-i))
)
((?(?=no(?8)\S)no|yes))
(\${(?P<type>VAR)\s+((?&var))\s*\=\s*((?&val))\s*\})(\S)?
1

Другие решения

Других решений пока нет …