PCRE2递归正则中如何保留匹配组并验证特定变量存在
PCRE2正则修改方案:确保输入含有效&开头变量
需求回顾
我用PCRE2正则验证符合特定规范的输入,输入允许:
$开头的变量&开头的变量(需至少存在一个,且不能在引号内)- 带双引号的字面量字符串
- 普通字符串
- 带参数的递归函数结构
示例合法输入:
&foo $foo(&bar) $foo(&bar+$baz) $foo($bar "baz" qux+$quux(&corge "grault") &garply)
现有正则能匹配结构,但无法确保存在有效&变量,且缺少完全匹配边界:
(?:\$\w+(?:\((?<arg>(?R)|(?:\"[^\"]*\")|(?:[^\$\"\&\s\(\)][^\s\(\)]*))(?:(?:\+| )(?&arg))*\))?)|(?<var>\&\w+)
最终修改后的正则
^(?=(?:[^"]|\"[^\"]*\")*\&\w+)(?:\$\w+(?:\((?<arg>(?R)|\"[^\"]*\"|[^\$\"\&\s\(\)][^\s\(\)]*)(?:(?:\+| )(?&arg))*\))?|\&\w+)$
修改逻辑说明
- 完全匹配约束:添加
^和$,确保正则匹配整个输入字符串,避免部分匹配的情况。 - 有效&变量校验:通过正向预查
(?=(?:[^"]|\"[^\"]*\")*\&\w+)实现:- 逻辑:遍历字符串时,跳过所有双引号包裹的内容,只在引号外查找
&\w+格式的变量,彻底排除引号内的&test这类无效场景。
- 逻辑:遍历字符串时,跳过所有双引号包裹的内容,只在引号外查找
- 保留递归结构:沿用原有的递归匹配逻辑,确保输入符合函数、变量、字符串的结构规范。
测试用例适配
该正则完全符合测试要求:
- 匹配:
&test、$test($test(test &var1 $var2) $test(jean) jean)、$test("&test" &test) - 拒绝:
$test、$test("&test")、$test( &test)、&test(foo)等所有不符合要求的输入
内容的提问来源于stack exchange,提问作者Kyrela
相关产品推荐
相关产品推荐

