求助:使用正则表达式提取含内部等号的参数-值组
参数-值对提取的正则解决方案
原正则失效的核心原因:仅通过负向预查判断后续是否为, 参数=的分隔模式,无法处理值内部包含括号、引号、等号的嵌套场景,会提前终止值的匹配。
修正后的正则表达式
/(?<parameter>[a-z_]+)\s*=\s*(?<value>(?:(?:\[((?:[^\[\]]|(?1))*)\]|\{((?:[^\{\}]|(?2))*)\}|(\((?:[^\(\)]|(?3))*\))|[^,\s=])+))(?:,\s*|$)/g
正则逻辑说明
(?<parameter>[a-z_]+):匹配由小写字母和下划线组成的参数名\s*=\s*:匹配参数与值之间的等号,前后允许任意空白字符(?<value>...):精准匹配参数值,处理三类嵌套结构及普通字符:\[((?:[^\[\]]|(?1))*)\]:递归匹配数组([])内部内容,支持嵌套数组\{((?:[^\{\}]|(?2))*)\}:递归匹配对象({})内部内容,支持嵌套对象\((?:[^\(\)]|(?3))*\):递归匹配函数调用(())内部内容,支持嵌套括号[^,\s=]:匹配非逗号、非空白、非等号的普通字符
(?:,\s*|$):匹配参数对之间的分隔逗号(带可选空白)或字符串结尾
测试示例
用JavaScript验证所有输入场景:
const testInputs = [ "collection_a=['U1', 'U2'], collection_b=['U1', 'U2']", "collection=['U1', 'U2'], callback_macro=utils.user_email(user_id=$$)", "collection=['U1', 'U2'], callback_macro=utils.user_email(user_id=$$, config={'user': 'ADMIN'})", "collection=['U1','U2'], callback_macro=string.replace(value=$$, pattern=^(.*)$, replacement={'user': $1})" ]; const paramRegex = /(?<parameter>[a-z_]+)\s*=\s*(?<value>(?:(?:\[((?:[^\[\]]|(?1))*)\]|\{((?:[^\{\}]|(?2))*)\}|(\((?:[^\(\)]|(?3))*\))|[^,\s=])+))(?:,\s*|$)/g; testInputs.forEach(input => { console.log(`输入:${input}`); let matchResult; while ((matchResult = paramRegex.exec(input)) !== null) { console.log(`Group Parameter = ${matchResult.groups.parameter},Group Value = ${matchResult.groups.value}`); } console.log('---'); });
运行后会输出符合要求的分组结果,完美适配所有测试场景。
内容的提问来源于stack exchange,提问作者Abhishek
相关产品推荐
相关产品推荐

