MATLAB正则表达使用技巧

前言

MATLAB正则表达用于快速搜索匹配字符串,相对于 strfind 函数查找字符的完全匹配项,正则表达式能够定义特定的查找模式。英文中将构造的正则表达式为 pattern,但是正则表达的语法使用起来较为复杂且使用场景不太熟悉,正则表达没有发挥出应有的功能。以下介绍几种典型的使用场景,提高程序的简洁,而且更加方便。

正则表达式函数

  1. regexp
  2. regexpi
  3. regexptranslate

构建表达式的步骤

以下内容取自MATLAB帮助文档:

  • 确定字符串中的独特模式
    这需要根据字符形式的类同情况对要搜索的文本进行拆分。这些字符形式可以是一系列小写字母、一个美元符号后跟三个数字,然后跟有一个小数点等。
  • 将每种模式表示为正则表达式
    使用本文档中所述的元字符和运算符将搜索模式的每个段表示为正则表达式。然后,将这些表达式段组合成单个表达式以在搜索时使用。
  • 调用合适的搜索函数
    将要解析的文本传递给其中一个搜索函数(例如 regexp 或 regexpi),或者传递给文本替代函数 regexprep。

快速查找头部的字符串

例如字符串 “ess.init.plant” ,获取 “ess” 字符串;可以将字符串加上一个特殊字符,将特殊字符作为一个标记位,另外将 “.” 作为另一个标记位,构造正则表达式,匹配头部字符串。最后将添加的标记位清除。

longName = 'ess.init.plant';
name= regexp( [ '$', longName], '\$\w*\.', 'match' );
name = name{ 1 }(2:end-1);

正则表达式中的标文灵活使用

以下内容出自 MATLAB 对 regexp 函数的帮助文档:

标文是对应于正则表达式部分的匹配文本。要创建标文,请将正则表达式部分括在圆括号中。标文的选项为 ‘tokens’,用来捕获标文的文本

str = 'Here is a date: 01-Apr-2020';
expression = '(\d+)-(\w+)-(\d+)';
mydate = regexp(str,expression,'tokens');
mydate{:}

ans =

'01'    'April'    '2020'

利用标文,与 tokens 联用,可以直接匹配得到括号中的内容,而不是所有正则表达式匹配的内容。当使用 match 选项时,则是匹配所有正则表达式匹配的内容:

str = 'Here is a date: 01-Apr-2020';
expression = '(\d+)-(\w+)-(\d+)';
mydate = regexp(str,expression,'match');
mydate{:}

ans =

'01-Apr-2020'

对于标文,还可以使用 name 选项,配合 ? < name> 语法直接对匹配到特定标文的内容命名,以便对匹配得到的标文内容更容易识别:

str = 'Here is a date: 01-Apr-2020';
expression = '(?<day>\d+)-(?<month>\w+)-(?<year>\d+)';
mydate = regexp(str,expression,'names')

mydate =

包含以下字段的 struct:

  day: '01'
month: 'Apr'
 year: '2020'

标文与数字之间的联系

表达式中的每个标文都被分配一个数字,从 1 开始,从左至右顺序递增。要在表达式的后面引用某个标文,请使用反斜杠并后跟标文编号进行引用。例如,引用表达式中第三组括号生成的标文时,请使用 \3

捕获匹配的 HTML 标记对组(例如 < a > 和 < /a >)以及这些标记之间的文本

hstr = '<!comment><a name="752507"></a><b>Default</b><br>';
expr = '<(\w+).*?>.*?</\1>';
[mat,tok] = regexp(hstr, expr, 'match', 'tokens');
mat{:}

下面对表达式 expr = ‘<(\w+).?>.?</\1>’; 进行解析:
第一部分: ‘<(\w+)’ 匹配左尖括号 (<),后跟一个或多个字母、数字或下划线字符。封闭的圆括号捕获左尖括号后面的标文字符。
第二部分: ‘.?>.?’ 匹配此 HTML 标记的其余部分(一直到 > 的字符),以及可能位于下一个左尖括号之前的任何字符。
最后一部分: ‘</\1>’ 匹配结尾的 HTML 标记中的所有字符。此标记由 序列组成,其中 tag 表示捕获为标文的任何字符。

替代文本中的标文

regexprep('Norma Jean Baker', '(\w+\s\w+)\s(\w+)', '$2, $1')

在替代文本中使用标文时,请使用 $1、$2 等符号,而不要使用 \1、\2 等符号来引用标文。此示例捕获两个标文并颠倒它们的顺序。第一个标文 $1 为 ‘Norma Jean’,第二个标文 $2 为 ‘Baker’。请注意,regexprep 返回修改后的文本,而不是起始索引的向量

上一篇:JS 正则表示式 字符串匹配 忽略大小写


下一篇:正则表达式的使用