下一个捕获组匹配 PCRE 的正则表达式条件先行
Regular Expression conditional lookahead with next capture group match 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,它就会捕获单词 'no',但如果它什么都没有,它不会捕获单词 'yes'。
您的模式包含 (?(?=ls)yes|no)
,它实际上是向前看字符 ls
。我已经更改了您的模式以利用 DEFINE
构造来实现子模式的可重用性。据我所知,PCRE 没有一种方法来检查组是否定义为 after 条件。这可以在 .net 中使用平衡组来完成,但 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)?
在不复制正向预测中的子模式的情况下,您可以使用以下 (as seen in use here)。令牌 (?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)?
我搜索了答案,但没有找到任何相关信息。 希望你能帮我解决我的问题。
所以我尝试使用基于字符串末尾捕获组的先行条件搜索字符串。 这意味着如果最后的捕获组匹配,则使条件组与某些东西匹配,如果最后的捕获组不匹配,则与其他东西匹配。
(?:((?(?=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,它就会捕获单词 'no',但如果它什么都没有,它不会捕获单词 'yes'。
您的模式包含 (?(?=ls)yes|no)
,它实际上是向前看字符 ls
。我已经更改了您的模式以利用 DEFINE
构造来实现子模式的可重用性。据我所知,PCRE 没有一种方法来检查组是否定义为 after 条件。这可以在 .net 中使用平衡组来完成,但 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)?
在不复制正向预测中的子模式的情况下,您可以使用以下 (as seen in use here)。令牌 (?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)?