MATLAB中regexp()如何匹配括号并提取左括号/点前的子串
MATLAB
regexp() 括号匹配规则与特殊字符转义方法 核心转义规则
MATLAB 正则语法中,以下字符属于正则元字符,若要匹配文本中对应的字面符号,必须在字符前加反斜杠\转义:(、)、[、]、{、}、*、+、?、|、^、$、.、\
其中括号类符号的特殊作用如下:
():标记捕获分组、命名分组、断言分组的边界,未配对的(会直接导致正则解析语法错误[]:标记字符集边界,匹配集合内的任意单个字符{}:标记匹配量词,指定前序规则的重复次数
字符集内部的特殊转义规则
在[]包裹的字符集内部,仅4个字符保留特殊含义,其余元字符直接书写即可匹配字面量,无需额外转义:
- 开头位置的
^:表示对字符集取反 - 两个字符中间的
-:表示字符范围 \:转义符本身]:标记字符集结束
原有正则的问题
你之前写的表达式错误原因如下:
(?<varname>.*?)(\(\d+\)){?}.:{属于量词元字符,此处无意义的{?}写法会触发解析逻辑错误;末尾的.未转义,会匹配任意单字符而非字面量点号;未覆盖「匹配左括号或点号任意一个作为终止边界」的需求(?<varname>.*?)(?<others>\(\d+\)){?}.:除上述相同问题外,额外加的分组强制要求匹配括号加数字的结构,无法适配qwer.asdf这种不带括号的场景(?<varname>.*?)\(:左括号转义正确,但仅匹配左括号作为终止符,未覆盖点号场景;非贪婪匹配从字符串起始位置匹配时,未加边界断言会导致匹配结果不符合预期(?<varname>.*?)(:作为分组起始的(没有对应闭合的),触发正则语法错误(?<varname>.*?)/(:多写了无意义的斜杠符号,且左括号未转义,存在语法错误
可直接运行的正确实现
需求是提取所有出现在左括号或点号之前的子串,用正向先行断言做终止边界即可,无需额外匹配终止符本身:
% 测试用例 example1 = 'qwer(1).asdf; qwer(1).zxcv;'; example2 = 'qwer.asdf; qwer.zxcv;'; % 正则:命名捕获组匹配连续字符,正向断言后面紧跟左括号或点号 expression = '(?<varname>\w+)(?=[(.])'; % 调用匹配 parts1 = regexp(example1, expression, 'names'); parts2 = regexp(example2, expression, 'names');
运行后parts1、parts2均会返回2个结构体,每个结构体的varname字段值为'qwer',符合预期。如果需要匹配的子串可能包含非字母数字下划线的字符,把捕获组里的\w+换成.*?即可。
内容的提问来源于stack exchange,提问作者Argyll
相关产品推荐
相关产品推荐

