正则表达式用相对比较复杂的规则匹配给定文本中的子字符串并进行提取。[大谦MATLAB,dqmatlab点com]
在MATLAB中使用regexp函数和regexpi函数,可以用指定的正则表达式在给定文本中查找指定的子文本。regexp函数查找的时候对给定的文本有大小写区分,regexpi函数则没有大小写区分。
regexp函数的语法格式为:
startIndex=regexp(str,expression) 返回 str 中与正则表达式expression匹配的每个子字符串的起始位置。如果没有匹配项,则 startIndex 为空数组。
[startIndex,endIndex]=regexp(str,expression) 返回所有匹配项的起始位置和结束位置。
out=regexp(str,expression,outkey) 返回 outkey 指定的输出。例如,如果 outkey 为 'match',则 regexp 返回与该表达式匹配的子字符串而非其起始位置。
[out1,...,outN]=regexp(str,expression,outkey1,...,outkeyN) 按指定的顺序返回多个输出关键字指定的输出。例如,如果指定 'match', 'tokens',则 regexp 返回与expression匹配的子字符串以及与部分表达式匹配的标文。
___=regexp(___,option1,...,optionM) 使用指定的选项标记。例如,指定 'ignorecase' 时不区分大小写。
___=regexp(___,'forceCellOutput') 以元胞数组的形式返回每个输出结果。
regexp函数的outkey参数可取下面的值。
'start'(默认值)所有匹配项的起始位置,输出到startIndex
'end' 所有匹配项的结束位置,输出到endIndex
'tokenExtents' 所有标文的起始位置和结束位置
'match' 与expression匹配的每个子字符串的文本
'tokens' str中每个捕获的标文的文本
'names' 每个命名标文的名称和文本
'split' str的非匹配子字符串的文本
regexp函数的option参数可以取下面的值。
'all'或'once' 尽可能多地匹配表达式(默认值),或仅匹配一次
'nowarnings'或'warnings' 取消警告(默认值),或显示警告
'matchcase'或'ignorecase' 匹配字母大小写(默认值),或忽略大小写
'noemptymatch'或'emptymatch' 忽略零长度匹配项(默认值),或包括这些匹配项
'dotall'或'dotexceptnewline' 将点与任意字符匹配(默认值),或与除换行符 (\n) 之外的所有字符匹配
'stringanchors'或'lineanchors' 将^和$元字符应用于字符向量的开头和结尾(默认值),或应用于行开头和结尾。换行符(\n)指定行的结尾。行的开头指定为第一个字符,或紧跟在换行符后面的任何字符
'literalspacing'或'freespacing' 在匹配时包括空格字符和注释(默认值),或忽略它们。使用'freespacing',使用'\ '和'\#'匹配空白和#字符
下面结合实例介绍用正则表达式实现子文本的查找。现在还没有介绍正则表达式的编写,本例使用最简单的情况,即匹配固定字符串的情况,从给定字符串中查找“abc”。
在命令窗口输入:
>> a='abc123def456AbC';
>> [startIndex,endIndex]=regexp(a,'abc')
startIndex =
1
endIndex =
3
返回找到的子字符串的起始位置和终止位置,即给定字符串中的第1个字符到第3个字符。注意,默认时查找是有大小写区分的。
下面返回匹配的字符串。
>> out=regexp(a,'abc','match')
out =
1×1 cell 数组
{'abc'}
下面用“matchcase”选项指定查找时区分大小写,返回匹配字符串的起始位置。
>> out=regexp(a,'abc','matchcase')
out =
1
下面用“ignorecase”选项指定查找时不区分大小写,返回匹配字符串的起始位置。
>> out=regexp(a,'abc','ignorecase')
out =
1 13
返回两个数字,说明找到两个匹配字符串。
除了通过设置option参数来指定匹配规则,还可以使用搜索标志来实现相同的任务。MATLAB正则表达式能使用的搜索标志如表2-1所示。
表2-1 搜索标志设置
| 标记 | 说 明 |
|---|---|
| (?-i) | 匹配字母大小写(regexp 和 regexprep 的默认值) |
| (?i) | 不匹配字母大小写(regexpi 的默认值) |
| (?s) | 将模式中的点 (.) 与任意字符匹配(默认值) |
| (?-s) | 将模式中的点与并非换行符的任意字符匹配 |
| (?-m) | 匹配文本开头和结尾的 ^ 和 $ 元字符(默认值) |
| (?m) | 匹配行开头和结尾的 ^ 和 $ 元字符 |
| (?-x) | 在匹配时包括空格字符和注释(默认值) |
| (?x) | 在匹配时忽略空格字符和注释。使用 '\ ' 和 '\#' 匹配空白和 # 字符 |
在命令行中输入:
>> out=regexp(a,'(?-i)abc')
out =
1
该命令语句与下面的语句等价:
>> out=regexp(a,'abc','matchcase')
都返回区分大小写时匹配字符串的起始位置。
下面的语句:
>> out=regexp(a,'(?i)abc')
out =
1 13
与语句
>> out=regexp(a,'abc','ignorecase')
等价,都返回不区分大小写时匹配字符串的起始位置。