regexp
匹配正则表达式(区分大小写)
语法
说明
返回 startIndex
= regexp(str
,expression
)str
中与该正则表达式指定的字符模式匹配的每个子字符串的起始索引。如果没有匹配项,则 startIndex
为空数组。如果有子字符串匹配重叠的文本片段,则只返回第一个匹配项的索引。
[
返回所有匹配项的开始和结束索引。startIndex
,endIndex
] = regexp(str
,expression
)
返回 out
= regexp(str
,expression
,outkey
)outkey
指定的输出。例如,如果 outkey
为 'match'
,则 regexp
返回与该表达式匹配的子字符串而非其开始索引。
___ = regexp(___,'forceCellOutput')
以标量元胞的形式返回每个输出参量。元胞包含被描述为上述语法输出的数值数组或子字符串。您可以包括任何输入并请求之前语法中的任何输出。
示例
查找文本中的模式
查找以 c
开头并以 t
结尾且其中包含一个或多个元音的单词。
str = 'bat cat can car coat court CUT ct CAT-scan'; expression = 'c[aeiou]+t'; startIndex = regexp(str,expression)
startIndex = 1×2
5 17
正则表达式 'c[aeiou]+t'
指定以下模式:
c
必须为第一个字符。c
必须后跟方括号内的一个字符[aeiou]
。括起的模式必须出现一次或多次,如
+
运算符所指示。t
必须为最后一个字符,括起的模式和t
之间没有任何字符。
startIndex
中的值指示与正则表达式匹配的每个单词的第一个字符的索引。匹配单词 cat
在索引 5 处开始,coat
在索引 17 处开始。单词 CUT
和 CAT
不匹配,因为它们是大写的。
查找多段文本中的模式
查找大写字母和空格在元胞数组中的字符向量中的位置。
str = {'Madrid, Spain','Romeo and Juliet','MATLAB is great'}; capExpr = '[A-Z]'; spaceExpr = '\s'; capStartIndex = regexp(str,capExpr); spaceStartIndex = regexp(str,spaceExpr);
capStartIndex
和 spaceStartIndex
是元胞数组,因为输入 str
是一个元胞数组。
查看大写字母的索引。
celldisp(capStartIndex)
capStartIndex{1} = 1 9 capStartIndex{2} = 1 11 capStartIndex{3} = 1 2 3 4 5 6
查看空格的索引。
celldisp(spaceStartIndex)
spaceStartIndex{1} = 8 spaceStartIndex{2} = 6 10 spaceStartIndex{3} = 7 10
使用 match 关键字返回子字符串
捕获字符向量中包含字母 x
的单词。
str = 'EXTRA! The regexp function helps you relax.'; expression = '\w*x\w*'; matchStr = regexp(str,expression,'match')
matchStr = 1x2 cell
{'regexp'} {'relax'}
正则表达式 '\w*x\w*'
指定该字符向量:
以任意数量的字母数字或下划线字符开头,
\w*
。包含小写字母
x
。以
x
后的任意数量的字母数字或下划线字符结尾,包括无任何内容,如\w*
指示。
使用 split 关键字在分隔符处拆分文本
将字符向量拆分为多个子字符串,其中每个子字符串以 ^
字符分隔。
str = ['Split ^this text into ^several pieces']; expression = '\^'; splitStr = regexp(str,expression,'split')
splitStr = 1x3 cell
{'Split '} {'this text into '} {'several pieces'}
因为克拉符号在正则表达式中具有特殊含义,所以在其前面使用转义字符,即反斜杠 (\
)。要在其他分隔符(例如分号)处拆分字符向量,则无需包括反斜杠。
返回匹配和非匹配子字符串
使用 'match'
关键字捕获与正则表达式匹配的字符向量部分,并使用 'split'
关键字捕获不匹配的剩余部分。
str = 'She sells sea shells by the seashore.'; expression = '[Ss]h.'; [match,noMatch] = regexp(str,expression,'match','split')
match = 1x3 cell
{'She'} {'she'} {'sho'}
noMatch = 1x4 cell
{0x0 char} {' sells sea '} {'lls by the sea'} {'re.'}
正则表达式 '[Ss]h.'
指定:
S
或s
为第一个字符。h
为第二个字符。第三个字符可以为任何字符(包括空格),如点 (
.
) 指示。
当字符向量中的第一个(或最后一个)字符匹配正则表达式时,'split'
关键字的第一个(或最后一个)返回值为空字符向量。
或者,从子字符串重新组合原始字符向量。
combinedStr = strjoin(noMatch,match)
combinedStr = 'She sells sea shells by the seashore.'
使用顺序词元捕获匹配项的子字符串
通过在正则表达式中定义词元来查找 HTML 标记的名称。词元用圆括号 ()
表示。
str = '<title>My Title</title><p>Here is some text.</p>'; expression = '<(\w+).*>.*</\1>'; [tokens,matches] = regexp(str,expression,'tokens','match');
正则表达式 <(\w+).*>.*</\1>
指定以下模式:
<(\w+)
查找左尖括号,后跟一个或多个字母数字或下划线字符。将\w+
括在圆括号中可在词元中捕获 HTML 标记的名称。.*>
查找任意数量的附加字符(例如 HTML 属性)以及右尖括号。</\1>
查找对应于第一个词元的结束标记(用\1
指示)。结束标记的形式为</tagname>
。
查看词元和匹配的子字符串。
celldisp(tokens)
tokens{1}{1} = title tokens{2}{1} = p
celldisp(matches)
matches{1} = <title>My Title</title> matches{2} = <p>Here is some text.</p>
使用命名词元捕获匹配项的子字符串
解析最先显示天或月的日期,这些日期采用以下格式:mm/dd/yyyy
或 dd-mm-yyyy
。使用指定词元标识日期的各部分。
str = '01/11/2000 20-02-2020 03/30/2000 16-04-2020'; expression = ['(?<month>\d+)/(?<day>\d+)/(?<year>\d+)|'... '(?<day>\d+)-(?<month>\d+)-(?<year>\d+)']; tokenNames = regexp(str,expression,'names');
正则表达式指定以下模式:
(?<name>\d+)
查找一个或多个数字并将结果分配给名称指示的词元。| 是一个逻辑
or
运算符,用于指示日期有两种可能模式。在第一个模式中,斜杠 (/
) 分隔词元。在第二个模式中,连字符 (-
) 分隔词元。
查看命名词元。
for k = 1:length(tokenNames) disp(tokenNames(k)) end
month: '01' day: '11' year: '2000' month: '02' day: '20' year: '2020' month: '03' day: '30' year: '2000' month: '04' day: '16' year: '2020'
执行不区分大小写的匹配
查找大写和小写形式的单词。
默认情况下,regexp
执行区分大小写的匹配。
str = 'A character vector with UPPERCASE and lowercase text.'; expression = '\w*case'; matchStr = regexp(str,expression,'match')
matchStr = 1x1 cell array
{'lowercase'}
正则表达式指定该字符向量:
以任意数量的字母数字或下划线字符开头,
\w*
。以字面文本
case
结尾。
regexpi
函数使用与 regexp
相同的语法,但执行不区分大小写的匹配。
matchWithRegexpi = regexpi(str,expression,'match')
matchWithRegexpi = 1x2 cell
{'UPPERCASE'} {'lowercase'}
或者,使用 'ignorecase'
选项对 regexp
禁用区分大小写的匹配。
matchWithIgnorecase = regexp(str,expression,'match','ignorecase')
matchWithIgnorecase = 1x2 cell
{'UPPERCASE'} {'lowercase'}
对于多个表达式,使用 (?i)
搜索标志对选定表达式禁用区分大小写的匹配。
expression = {'(?-i)\w*case';... '(?i)\w*case'}; matchStr = regexp(str,expression,'match'); celldisp(matchStr)
matchStr{1}{1} = lowercase matchStr{2}{1} = UPPERCASE matchStr{2}{2} = lowercase
解析包含换行符的文本
创建一个包含换行符 \n
的字符向量,并使用正则表达式解析该字符向量。由于 regexp
将 matchStr
返回为包含具有多行文本的元胞数组,因此您可以将文本从元胞数组中取出以显示所有行。
str = sprintf('abc\n de'); expression = '.*'; matchStr = regexp(str,expression,'match'); matchStr{:}
ans = 'abc de'
默认情况下,点 (.
) 与每个字符(包括换行符)匹配,并返回等同于原始字符向量的单个匹配项。
使用 'dotexceptnewline'
选项从匹配项中排除换行符。这返回每行文本的单独匹配项。
matchStrNoNewline = regexp(str,expression,'match','dotexceptnewline')
matchStrNoNewline = 1x2 cell
{'abc'} {' de'}
使用 ^
或 $
元字符及 'lineanchors'
选项查找每行的第一个或最后一个字符。
expression = '.$'; lastInLine = regexp(str,expression,'match','lineanchors')
lastInLine = 1x2 cell
{'c'} {'e'}
返回元胞中的匹配项
在一段文本中查找匹配项,并在标量元胞中返回输出。
查找以 c 开头、以 t 结尾且在这两个字母之间包含有一个或多个元音字母的单词。在标量元胞中返回起始索引。
str = 'bat cat can car coat court CUT ct CAT-scan'; expression = 'c[aeiou]+t'; startIndex = regexp(str,expression,'forceCellOutput')
startIndex = 1x1 cell array
{[5 17]}
要以数值数组形式访问起始索引,请对元胞进行索引。
startIndex{1}
ans = 1×2
5 17
返回匹配和非匹配子字符串。每个输出都位于其自己的标量元胞中。
[match,noMatch] = regexp(str,expression,'match','split','forceCellOutput')
match = 1x1 cell array
{1x2 cell}
noMatch = 1x1 cell array
{1x3 cell}
要访问匹配项数组,请对 match
进行索引。
match{1}
ans = 1x2 cell
{'cat'} {'coat'}
要访问不匹配的子字符串,请对 noMatch
进行索引。
noMatch{1}
ans = 1x3 cell
{'bat '} {' can car '} {' court CUT ct CAT-scan'}
输入参数
str
— 输入文本
字符向量 | 字符向量元胞数组 | 字符串数组
输入文本,指定为字符向量、字符向量元胞数组或字符串数组。元胞数组中的每个字符向量或字符串数组中的每个字符串可以为任意长度并包含任意字符。
如果 str
和 expression
均为字符串数组或元胞数组,则它们的维度必须相同。
数据类型: string
| char
| cell
expression
— 正则表达式
字符向量 | 字符向量元胞数组 | 字符串数组
正则表达式,指定为字符向量、字符向量元胞数组或字符串数组。每个表达式可包含字符、元字符、运算符、词元和用于指定在 str
中匹配的模式的标志。
下表描述了正则表达式的各元素。
元字符
元字符表示字母、字母范围、数字和空格字符。使用它们来构造广义的字符模式。
元字符 | 描述 | 示例 |
---|---|---|
| 任何单个字符,包括空白 |
|
| 包含在方括号中的任意字符。下列字符将按字面意义进行处理: |
|
| 未包含在方括号中的任意字符。下列字符将按字面意义进行处理: |
|
|
|
|
| 任意字母、数字或下划线字符。对于英语字符集, |
|
| 字母、数字或下划线之外的任意字符。对于英语字符集, |
|
| 任意空白字符;等同于 |
|
| 任意非空白字符;等同于 |
|
| 任意数字;等同于 |
|
| 任意非数字字符;等同于 |
|
| 八进制值 |
|
| 十六进制值 |
|
字符表示
运算符 | 描述 |
---|---|
| 警报(蜂鸣) |
| 退格符 |
| 换页符 |
| 换行符 |
| 回车符 |
| 水平制表符 |
| 垂直制表符 |
| 正则表达式中您要从字面上匹配(例如,使用 |
限定符
限定符指定某个模式必须出现在匹配文本中的次数。
限定符 | 表达式出现的次数 | 示例 |
---|---|---|
| 0 次或连续多次。 |
|
| 0 次或 1 次。 |
|
| 1 次或连续多次。 |
|
| 至少
|
|
| 至少连续
|
|
| 恰好连续 等效于 |
|
限定符可以以三种模式显示,如下表所述。q 表示上表中的任意限定符。
模式 | 描述 | 示例 |
---|---|---|
| 积极表达式:与尽可能多的字符匹配。 | 给定文本
|
| 消极表达式:与所需的尽可能少的字符匹配。 | 给定文本
|
| 主动表达式:最大程度地匹配,但不重新扫描文本的任何部分。 | 给定文本 |
分组运算符
分组运算符允许您捕获词元,将一个运算符应用于多个元素或在特定组中禁止追溯。
分组运算符 | 描述 | 示例 |
---|---|---|
| 将表达式元素分组并捕获词元。 |
|
| 分组但不捕获词元。 |
不进行分组时, |
| 以原子方式分组。不在组中追溯以完成匹配,并且不捕获词元。 |
|
| 匹配表达式 如果存在与 您可以在左括号后包括 |
|
定位点
表达式中的定位点与文本或单词的开头或结尾匹配。
定位点 | 与以下项匹配 | 示例 |
---|---|---|
| 输入文本的开头。 |
|
| 输入文本的结尾。 |
|
| 单词开头。 |
|
| 单词结尾。 |
|
环顾断言
环顾断言查找紧邻预期匹配项前后但并非该匹配项一部分的模式。
指针停留在当前位置,并且将放弃或不捕获对应于 test
表达式的字符。因此,前向断言可匹配重叠字符组。
环顾断言 | 描述 | 示例 |
---|---|---|
| 向前查找与 |
|
| 向前查找与 |
|
| 向后查找与 |
|
| 向后查找与 |
|
如果您在表达式之前指定前向断言,则运算等同于逻辑 AND
。
运算 | 描述 | 示例 |
---|---|---|
| 同时与 |
|
| 匹配 |
|
逻辑和条件运算符
逻辑和条件运算符允许您测试给定条件的状态,然后使用结果确定哪个模式(如果有)与下一条件匹配。这些运算符支持逻辑 OR
、if
或 if/else
条件。
条件可以是词元、环顾运算符或 (?@cmd)
形式的动态表达式。动态表达式必须返回逻辑值或数值。
条件运算符 | 描述 | 示例 |
---|---|---|
| 匹配表达式 如果存在与 |
|
| 如果条件 |
|
| 如果条件 |
|
词元运算符
词元是您通过将正则表达式的部分括在括号中而定义的匹配文本的部分。您可以按词元在文本中的顺序引用该词元(顺序词元),或将名称分配给词元以便于代码维护和使输出更易于阅读。
顺序词元运算符 | 描述 | 示例 |
---|---|---|
| 在词元中捕获与括起来的表达式匹配的字符。 |
|
| 匹配第 |
|
| 如果找到第 |
|
命名词元运算符 | 描述 | 示例 |
---|---|---|
| 在命名词元中捕获与括起来的表达式匹配的字符。 |
|
| 匹配 |
|
| 如果找到命名词元,则匹配 |
|
注意
如果表达式具有嵌套括号,则 MATLAB® 捕获对应于最外层括号的词元。例如,给定搜索模式 '(and(y|rew))'
,MATLAB 将为 'andrew'
但不为 'y'
或 'rew'
创建一个词元。
动态正则表达式
动态表达式允许您执行 MATLAB 命令或正则表达式以确定要匹配的文本。
将动态表达式括起来的括号不创建捕获组。
运算符 | 描述 | 示例 |
---|---|---|
| 解析 解析后, |
|
| 执行 |
|
| 执行 |
|
在动态表达式中,使用下列运算符定义替代文本。
替代运算符 | 描述 |
---|---|
| 当前作为匹配项的输入文本部分 |
| 位于当前匹配项之前的输入文本部分 |
| 紧随当前匹配项的输入文本部分(使用 |
| 第 |
| 命名词元 |
| 在 MATLAB 执行命令 |
注释
字符 | 描述 | 示例 |
---|---|---|
(?#comment) | 在正则表达式中插入注释。匹配输入时将忽略注释文本。 |
|
搜索标志
搜索标志修改匹配表达式的行为。在表达式中使用搜索标志的替代方法是传递 option
输入参量。
标志 | 描述 |
---|---|
(?-i) | 匹配字母大小写( |
(?i) | 不匹配字母大小写( |
(?s) | 将模式中的点 ( |
(?-s) | 将模式中的点与并非换行符的任意字符匹配。 |
(?-m) | 匹配文本开头和结尾的 |
(?m) | 匹配行开头和结尾的 |
(?-x) | 在匹配时包括空格字符和注释(默认值)。 |
(?x) | 在匹配时忽略空格字符和注释。使用 |
该标志修改的表达式可显示在括号后,例如
(?i)\w*
或显示在括号内并使用冒号 (:
) 与该标志分隔开,例如
(?i:\w*)
后面的语法允许您更改较大表达式的一部分的行为。
数据类型: char
| cell
| string
outkey
— 指示要返回的输出的关键字
'start'
(默认) | 'end'
| 'tokenExtents'
| 'match'
| 'tokens'
| 'names'
| 'split'
指示要返回的输出的关键字,指定为下列字符向量之一。
输出关键字 | 返回 |
---|---|
| 所有匹配项的开始索引, |
| 所有匹配项的结束索引, |
| 所有词元的开始和结束索引 |
| 与 |
|
|
| 每个命名词元的名称和文本 |
|
|
数据类型: char
| string
option
— 搜索选项
'once'
| 'warnings'
| 'ignorecase'
| 'emptymatch'
| 'dotexceptnewline'
| 'lineanchors'
| ...
搜索选项,指定为字符向量。选项成对出现:一个选项对应于默认行为,另一个选项允许您覆盖默认值。仅指定一对中的一个选项。选项可以按任意顺序显示。
默认值 | 覆盖 | 描述 |
---|---|---|
|
| 尽可能多次地匹配表达式(默认值),或仅匹配一次。 |
|
| 取消警告(默认值),或显示警告。 |
|
| 匹配字母大小写(默认值),或忽略大小写。 |
|
| 忽略零长度匹配项(默认值),或包括这些匹配项。 |
|
| 将点与任意字符匹配(默认值),或与除换行符 ( |
|
| 将 |
|
| 在匹配时包括空格字符和注释(默认值),或忽略它们。借助 |
数据类型: char
| string
输出参量
startIndex
— 每个匹配项的开始索引
行向量 | 行向量元胞数组
每个匹配项的开始索引,以行向量或元胞数组的形式返回,如下所示:
如果
str
和expression
均为字符向量或字符串标量,则输出为行向量(或者,如果没有任何匹配项,则为空数组)。如果
str
或expression
有一个是字符向量元胞数组或字符串数组,另一个是字符向量或字符串标量,则输出是行向量元胞数组。输出元胞数组与输入数组具有相同的维度。如果
str
和expression
均为元胞数组或字符串数组,则它们的维度必须相同。输出是具有相同维度的元胞数组。
endIndex
— 每个匹配项的结束索引
行向量 | 行向量元胞数组
每个匹配项的结束索引,以行向量或元胞数组的形式返回,如下所示:
如果
str
和expression
均为字符向量或字符串标量,则输出为行向量(或者,如果没有任何匹配项,则为空数组)。如果
str
或expression
有一个是字符向量元胞数组或字符串数组,另一个是字符向量或字符串标量,则输出是行向量元胞数组。输出元胞数组与输入数组具有相同的维度。如果
str
和expression
均为元胞数组或字符串数组,则它们的维度必须相同。输出是具有相同维度的元胞数组。
out
— 有关匹配项的信息
数值数组 | 元胞数组 | 字符串数组 | 结构体数组
有关匹配项的信息,以数值、元胞、字符串或结构体数组的形式返回。输出中的信息取决于您为 outkey
指定的值,如下所示。
输出关键字 | 输出描述 | 输出类型和维度 |
---|---|---|
| 匹配项的开始索引 | 对于
|
| 匹配项的结束索引 | |
| 所有词元的开始和结束索引 | 默认情况下,当返回所有匹配项时:
当指定 如果在特定索引 |
| 与 | 默认情况下,当返回所有匹配项时:
如果您指定 |
|
| 默认情况下,当返回所有匹配项时:
如果您指定 如果在特定索引处需要有词元,但未找到,MATLAB 将为词元返回空值:对于字符向量,返回 |
| 每个命名词元的名称和文本 | 对于所有匹配项:
|
|
| 对于所有匹配项:
|
详细信息
词元
词元是对应于正则表达式部分的匹配文本部分。要创建词元,请将正则表达式部分括在圆括号中。
例如,此表达式查找 dd-mmm-yyyy
形式的日期,包括日、月和年的词元。
str = 'Here is a date: 01-Apr-2020'; expression = '(\d+)-(\w+)-(\d+)'; mydate = regexp(str,expression,'tokens'); mydate{:}
ans = 1×3 cell array {'01'} {'Apr'} {'2020'}
可以将名称与词元关联起来以使其更便于识别:
str = 'Here is a date: 01-Apr-2020'; expression = '(?<day>\d+)-(?<month>\w+)-(?<year>\d+)'; mydate = regexp(str,expression,'names')
mydate = struct with fields: day: '01' month: 'Apr' year: '2020'
有关详细信息,请参阅正则表达式中的词元。
算法
MATLAB 从左向右解析每个输入字符向量或字符串,并尝试将该字符向量或字符串中的文本与正则表达式的第一个元素匹配。在此过程中,MATLAB 跳过不匹配的任何文本。
如果 MATLAB 发现第一部分匹配,则继续解析以匹配该表达式的第二部分,以此类推。
扩展功能
基于线程的环境
使用 MATLAB® backgroundPool
在后台运行代码或使用 Parallel Computing Toolbox™ ThreadPool
加快代码运行速度。
此函数完全支持基于线程的环境。有关详细信息,请参阅在基于线程的环境中运行 MATLAB 函数。
版本历史记录
在 R2006a 之前推出
MATLAB 命令
您点击的链接对应于以下 MATLAB 命令:
请在 MATLAB 命令行窗口中直接输入以执行命令。Web 浏览器不支持 MATLAB 命令。
Select a Web Site
Choose a web site to get translated content where available and see local events and offers. Based on your location, we recommend that you select: .
You can also select a web site from the following list:
How to Get Best Site Performance
Select the China site (in Chinese or English) for best site performance. Other MathWorks country sites are not optimized for visits from your location.
Americas
- América Latina (Español)
- Canada (English)
- United States (English)
Europe
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)