Matlab正则表达式如何匹配含特殊字符的动态文本组件?
问题场景
要编写正则表达式匹配一段文本,其中某部分是变量中的动态内容——这个变量的字符串可能包含Matlab正则引擎里的操作符、量词、元字符(比如(, [, ]这类),必须原样匹配这部分内容。用strfind不太方便,因为需要同时匹配这段动态内容前后的特定模式,分开处理太繁琐。
举个实际例子:
pat_b='%%\s+(?<name1>abc\d{6})\s+'; % 目标内容前的匹配模式 txt='asdf(1).qwer=[123:456,789]; zxcv;'; % 要原样匹配的动态文本(来自变量) pat_a='\s+%%\s+(?<name2>\w{6})'; % 目标内容后的匹配模式
之前尝试过下面的代码但匹配失败,核心原因是动态调用返回的txt内容没有转义正则特殊字符:
f_txt=@()txt; expression=[pat_b,'(??@f_txt())',pat_a]; regexp(txt_to_search,expression,'names'),
解决方法
核心思路是先把变量里的文本转义正则元字符,Matlab自带的regexptranslate函数的'escape'选项可以直接完成这个操作——它会把所有正则特殊字符转换成字面匹配的形式,不会干扰正则引擎的解析。
有两种实现方式:
- 先转义再拼接模式
escaped_txt = regexptranslate('escape', txt); expression = [pat_b, escaped_txt, pat_a]; result = regexp(txt_to_search, expression, 'names');
- 如果一定要用动态正则语法(
(??@...)),就在动态函数内部先完成转义
f_txt=@()regexptranslate('escape', txt); expression=[pat_b,'(??@f_txt())',pat_a]; result = regexp(txt_to_search,expression,'names');
这样不管txt里包含多少正则特殊字符,都会被当成普通文本匹配,不会破坏前后正则模式的逻辑。
内容的提问来源于stack exchange,提问作者Argyll
相关产品推荐
相关产品推荐

