Я искал ответ и ничего не нашел по этому поводу.
надеюсь, что вы можете помочь мне с моим вопросом.
Поэтому я пытаюсь найти строку с условным условным списком на основе группы захвата в конце строки.
Это означает, что если группа захвата в конце совпадает, задайте условную группу с чем-то, а если группа захвата в конце не совпадает с чем-то другим.
Смотрите мое регулярное выражение в использовании здесь
(?:((?(?=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, но он не фиксирует слово «да», если это ничего.
Ваш шаблон содержит (?(?=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)?
Других решений пока нет …