You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 09:42:28