如何编写Matlab正则表达式精准匹配脚本中指定变量的赋值语句?
Matlab赋值语句精准匹配变量名正则方案
问题核心原因
你之前的正则没有对变量名做边界限制,只要目标字符串作为子串出现在匹配区间内就会命中,所以aabc、abcc这类包含abc子串的变量名也会被误判。
解决方案:添加变量名边界断言
利用Matlab正则支持的零宽负向断言限定变量名的前后只能是变量分隔符(逗号、方括号、等号、行首),不能是字母、数字、下划线(Matlab变量名允许的字符),即可实现精准匹配。
最终正则表达式
% 匹配abc、def两个目标变量的场景,可自行替换为你需要的变量列表 pattern = '^(\[.*?)?(?<![a-zA-Z0-9_])(abc|def)(?![a-zA-Z0-9_])(.*?\])?=';
正则各部分说明
^(\[.*?)?:匹配行首开始的可选方括号前缀及括号内目标变量前的内容,非贪婪匹配避免越界(?<![a-zA-Z0-9_]):负向回顾断言,要求目标变量前不能出现合法变量名字符,避免匹配aabc这类前缀多余的变量(abc|def):替换为你需要检测的变量名列表,用|分隔(?![a-zA-Z0-9_]):负向前瞻断言,要求目标变量后不能出现合法变量名字符,避免匹配abcc这类后缀多余的变量(.*?\])?=:匹配目标变量后的可选方括号后缀内容,直到命中赋值等号
动态生成正则(变量多的时候更方便)
如果需要检测的变量较多,可以批量拼接生成正则,不用手动写分隔符:
% 自定义要检测的变量列表 target_vars = {'var1','var2','var3','abc','def'}; pattern = sprintf('^(\\[.*?)?(?<![a-zA-Z0-9_])(%s)(?![a-zA-Z0-9_])(.*?\\])?=', strjoin(target_vars, '|'));
测试验证结果
所有测试用例均可正确匹配:
- 正确命中的场景:
regexp('abc=1',pattern,'once')→ 输出1regexp('[other,abc]=deal(1,2)',pattern,'once')→ 输出1
- 正确排除的场景:
regexp('x=1',pattern,'once')→ 输出[]regexp('aabc=1',pattern,'once')→ 输出[]regexp('[x,aabcc]=deal(1,2)',pattern,'once')→ 输出[]regexp('[x,abcc,y]=deal(1,2,3)',pattern,'once')→ 输出[]
内容的提问来源于stack exchange,提问作者wsdzbm
相关产品推荐
相关产品推荐

