Main Content

regexp

匹配正则表达式(区分大小写)

说明

示例

startIndex = regexp(str,expression) 返回 str 中与该正则表达式指定的字符模式匹配的每个子字符串的起始索引。如果没有匹配项,则 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 返回与整个表达式匹配的子字符串以及与部分表达式匹配的词元

示例

___ = regexp(___,option1,...,optionM) 使用指定的选项标志修改搜索。例如,指定 'ignorecase' 以执行不区分大小写的匹配。您可以包括任何输入并请求之前语法中的任何输出。

示例

___ = 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 处开始。单词 CUTCAT 不匹配,因为它们是大写的。

查找大写字母和空格在元胞数组中的字符向量中的位置。

str = {'Madrid, Spain','Romeo and Juliet','MATLAB is great'};
capExpr = '[A-Z]';
spaceExpr = '\s';

capStartIndex = regexp(str,capExpr);
spaceStartIndex = regexp(str,spaceExpr);

capStartIndexspaceStartIndex 是元胞数组,因为输入 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

 

捕获字符向量中包含字母 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* 指示。

将字符向量拆分为多个子字符串,其中每个子字符串以 ^ 字符分隔。

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.' 指定:

  • Ss 为第一个字符。

  • 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/yyyydd-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 的字符向量,并使用正则表达式解析该字符向量。由于 regexpmatchStr 返回为包含具有多行文本的元胞数组,因此您可以将文本从元胞数组中取出以显示所有行。

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'}

输入参数

全部折叠

输入文本,指定为字符向量、字符向量元胞数组或字符串数组。元胞数组中的每个字符向量或字符串数组中的每个字符串可以为任意长度并包含任意字符。

如果 strexpression 均为字符串数组或元胞数组,则它们的维度必须相同。

数据类型: string | char | cell

正则表达式,指定为字符向量、字符向量元胞数组或字符串数组。每个表达式可包含字符、元字符、运算符、词元和用于指定在 str 中匹配的模式的标志。

下表描述了正则表达式的各元素。

元字符

元字符表示字母、字母范围、数字和空格字符。使用它们来构造广义的字符模式。

元字符

描述

示例

.

任何单个字符,包括空白

'..ain' 与以 'ain' 结尾的五个连续字符序列匹配。

[c1c2c3]

包含在方括号中的任意字符。下列字符将按字面意义进行处理:$ | . * + ?-(不用于指示范围时)。

'[rp.]ain''rain''pain''.ain' 匹配。

[^c1c2c3]

未包含在方括号中的任意字符。下列字符将按字面意义进行处理:$ | . * + ?-(不用于指示范围时)。

'[^*rp]ain' 与以 'ain' 结尾的所有由四个字母组成的序列('rain''pain''*ain' 除外)匹配。例如,它与 'gain''lain''vain' 匹配。

[c1-c2]

c1c2 范围中的任意字符

'[A-G]'AG 范围中的单个字符匹配。

\w

任意字母、数字或下划线字符。对于英语字符集,\w 等同于 [a-zA-Z_0-9]

'\w*' 识别由字母、数字或下划线字符组成的词。

\W

字母、数字或下划线之外的任意字符。对于英语字符集,\W 等同于 [^a-zA-Z_0-9]

'\W*' 标识不是由任意字母、数字或下划线字符组合而成的词。

\s

任意空白字符;等同于 [ \f\n\r\t\v]

'\w*n\s' 与以字母 n 结尾且后跟空白字符的单词匹配。

\S

任意非空白字符;等同于 [^ \f\n\r\t\v]

'\d\S' 与数字(后跟任意非空白字符)匹配。

\d

任意数字;等同于 [0-9]

'\d*' 与任意数量的连续数字匹配。

\D

任意非数字字符;等同于 [^0-9]

'\w*\D\>' 与不以数字结尾的单词匹配。

\oN\o{N}

八进制值 N 的字符

'\o{40}' 与八进制 40 定义的空格字符匹配。

\xN\x{N}

十六进制值 N 的字符

'\x2C' 与十六进制 2C 定义的逗号字符匹配。

字符表示

运算符

描述

\a

警报(蜂鸣)

\b

退格符

\f

换页符

\n

换行符

\r

回车符

\t

水平制表符

\v

垂直制表符

\char

正则表达式中您要从字面上匹配(例如,使用 \\ 匹配单个反斜杠)的具有特殊含义的任意字符。

限定符

限定符指定某个模式必须出现在匹配文本中的次数。

限定符

表达式出现的次数

示例

expr*

0 次或连续多次。

'\w*' 与任意长度的单词匹配。

expr?

0 次或 1 次。

'\w*(\.m)?' 与单词或以扩展名 .m 结尾(此条件为可选条件)的单词匹配。

expr+

1 次或连续多次。

'<img src="\w+\.gif">'<img> HTML 标记匹配(当文件名包含一个或多个字符时)。

expr{m,n}

至少 m 次,但不超过连续 n 次。

{0,1} 等效于 ?

'\S{4,8}' 与四到八个非空白字符匹配。

expr{m,}

至少连续 m 次。

{0,}{1,} 分别等效于 *+

'<a href="\w{1,}\.html">'<a> HTML 标记匹配(当文件名包含一个或多个字符时)。

expr{n}

恰好连续 n 次。

等效于 {n,n}

'\d{4}' 与四个连续数字匹配。

限定符可以以三种模式显示,如下表所述。q 表示上表中的任意限定符。

模式

描述

示例

exprq

积极表达式:与尽可能多的字符匹配。

给定文本 '<tr><td><p>text</p></td>',表达式 '</?t.*>' 与介于 <tr/td> 之间的所有字符匹配:

'<tr><td><p>text</p></td>'

exprq?

消极表达式:与所需的尽可能少的字符匹配。

给定文本 '<tr><td><p>text</p></td>',表达式 '</?t.*?>' 在第一次出现右尖括号 (>) 时结束每个匹配项:

'<tr>' '<td>' '</td>'

exprq+

主动表达式:最大程度地匹配,但不重新扫描文本的任何部分。

给定文本 '<tr><td><p>text</p></td>',表达式 '</?t.*+>' 不返回任何匹配项,这是因为右尖括号是使用 .* 捕获的且不进行重新扫描。

分组运算符

分组运算符允许您捕获词元,将一个运算符应用于多个元素或在特定组中禁止追溯。

分组运算符

描述

示例

(expr)

将表达式元素分组并捕获词元。

'Joh?n\s(\w*)' 捕获一个词元,该词元包含名字为 JohnJon 的任何人的姓氏。

(?:expr)

分组但不捕获词元。

'(?:[aeiou][^aeiou]){2}' 与两个连续的元音后跟非元音(例如 'anon')的模式匹配。

不进行分组时,'[aeiou][^aeiou]{2}' 与元音后跟两个非元音匹配。

(?>expr)

以原子方式分组。不在组中追溯以完成匹配,并且不捕获词元。

'A(?>.*)Z''AtoZ' 不匹配,但 'A(?:.*)Z' 与其匹配。使用原子组时,Z 将使用 .* 进行捕获并且不进行重新扫描。

(expr1|expr2)

匹配表达式 expr1 或表达式 expr2

如果存在与 expr1 匹配的项,则将忽略 expr2

您可以在左括号后包括 ?:?> 以禁用词元或以原子方式分组。

'(let|tel)\w+' 匹配包含 lettel 但不以它们结尾的单词。

定位点

表达式中的定位点与文本或单词的开头或结尾匹配。

定位点

与以下项匹配

示例

^expr

输入文本的开头。

'^M\w*' 与以 M 作为文本开头的单词匹配。

expr$

输入文本的结尾。

'\w*m$' 与以 m 作为文本结尾的单词匹配。

\<expr

单词开头。

'\<n\w*' 与以 n 开头的任何单词匹配。

expr\>

单词结尾。

'\w*e\>' 与以 e 结尾的任何单词匹配。

环顾断言

环顾断言查找紧邻预期匹配项前后但并非该匹配项一部分的模式。

指针停留在当前位置,并且将放弃或不捕获对应于 test 表达式的字符。因此,前向断言可匹配重叠字符组。

环顾断言

描述

示例

expr(?=test)

向前查找与 test 匹配的字符。

'\w*(?=ing)' 匹配后跟 ing 的词汇,例如输入文本 'Flying, not falling.' 中的 'Fly''fall'

expr(?!test)

向前查找与 test 不匹配的字符。

'i(?!ng)' 匹配字母 i 的不后跟 ng 的实例。

(?<=test)expr

向后查找与 test 匹配的字符。

'(?<=re)\w*' 匹配紧跟 're' 的词汇,例如输入文本 'renew, reuse, recycle' 中的 'new''use''cycle'

(?<!test)expr

向后查找与 test 不匹配的字符。

'(?<!\d)(\d)(?!\d)' 与一位数字匹配(不紧随其他数字前后的数字)。

如果您在表达式之前指定前向断言,则运算等同于逻辑 AND

运算

描述

示例

(?=test)expr

同时与 testexpr 匹配。

'(?=[a-z])[^aeiou]' 与辅音匹配。

(?!test)expr

匹配 expr,但不匹配 test

'(?![aeiou])[a-z]' 与辅音匹配。

逻辑和条件运算符

逻辑和条件运算符允许您测试给定条件的状态,然后使用结果确定哪个模式(如果有)与下一条件匹配。这些运算符支持逻辑 ORifif/else 条件。

条件可以是词元、环顾运算符或 (?@cmd) 形式的动态表达式。动态表达式必须返回逻辑值或数值。

条件运算符

描述

示例

expr1|expr2

匹配表达式 expr1 或表达式 expr2

如果存在与 expr1 匹配的项,则将忽略 expr2

'(let|tel)\w+' 匹配以 lettel 开头的单词。

(?(cond)expr)

如果条件 condtrue,则匹配 expr

'(?(?@ispc)[A-Z]:\\)' 匹配驱动器名称,例如 C:\(在 Windows® 系统上运行时)。

(?(cond)expr1|expr2)

如果条件 condtrue,则匹配 expr1。否则,匹配 expr2

'Mr(s?)\..*?(?(1)her|his) \w*' 匹配包含 her 的文本(当文本以 Mrs 开头时),或包含 his 的文本(当文本以 Mr 开头时)。

词元运算符

词元是您通过将正则表达式的部分括在括号中而定义的匹配文本的部分。您可以按词元在文本中的顺序引用该词元(顺序词元),或将名称分配给词元以便于代码维护和使输出更易于阅读。

顺序词元运算符

描述

示例

(expr)

在词元中捕获与括起来的表达式匹配的字符。

'Joh?n\s(\w*)' 捕获一个词元,该词元包含名字为 JohnJon 的任何人的姓氏。

\N

匹配第 N 个词元。

'<(\w+).*>.*</\1>' 从文本 '<title>Some text</title>' 捕获 HTML 标记的词元,例如 'title'

(?(N)expr1|expr2)

如果找到第 N 个词元,则匹配 expr1。否则,匹配 expr2

'Mr(s?)\..*?(?(1)her|his) \w*' 匹配包含 her 的文本(当文本以 Mrs 开头时),或包含 his 的文本(当文本以 Mr 开头时)。

命名词元运算符

描述

示例

(?<name>expr)

在命名词元中捕获与括起来的表达式匹配的字符。

'(?<month>\d+)-(?<day>\d+)-(?<yr>\d+)'mm-dd-yy 形式的输入日期中创建命名月、日和年词元。

\k<name>

匹配 name 引用的词元。

'<(?<tag>\w+).*>.*</\k<tag>>' 从文本 '<title>Some text</title>' 捕获 HTML 标记的词元,例如 'title'

(?(name)expr1|expr2)

如果找到命名词元,则匹配 expr1。否则,匹配 expr2

'Mr(?<sex>s?)\..*?(?(sex)her|his) \w*' 匹配包含 her 的文本(当文本以 Mrs 开头时),或包含 his 的文本(当文本以 Mr 开头时)。

注意

如果表达式具有嵌套括号,则 MATLAB® 捕获对应于最外层括号的词元。例如,给定搜索模式 '(and(y|rew))',MATLAB 将为 'andrew' 但不为 'y''rew' 创建一个词元。

动态正则表达式

动态表达式允许您执行 MATLAB 命令或正则表达式以确定要匹配的文本。

将动态表达式括起来的括号创建捕获组。

运算符

描述

示例

(??expr)

解析 expr 并将得到的项包括在匹配表达式中。

解析后,expr 必须对应于完整的有效正则表达式。使用反斜杠转义字符 (\) 的动态表达式需要两个反斜杠:一个用于 expr 的初始解析,一个用于完整匹配。

'^(\d+)((??\\w{$1}))' 通过读取匹配项开头的数字确定匹配的字符数。动态表达式括在另一组括号中,以便在词元中捕获生成的匹配项。例如,匹配 '5XXXXX' 将捕获 '5''XXXXX' 的词元。

(??@cmd)

执行 cmd 表示的 MATLAB 命令,并将该命令返回的输出包括在匹配表达式中。

'(.{2,}).?(??@fliplr($1))' 查找长度至少为四个字符的回文,例如 'abba'

(?@cmd)

执行 cmd 表示的 MATLAB 命令,但放弃该命令返回的任何输出。(对诊断正则表达式有帮助。)

'\w*?(\w)(?@disp($1))\1\w*' 匹配包括双字母(例如 pp)的单词并显示中间结果。

在动态表达式中,使用下列运算符定义替代文本。

替代运算符

描述

$&$0

当前作为匹配项的输入文本部分

$`

位于当前匹配项之前的输入文本部分

$'

紧随当前匹配项的输入文本部分(使用 $'' 表示 $'

$N

N 个词元

$<name>

命名词元

${cmd}

在 MATLAB 执行命令 cmd 时返回的输出

注释

字符

描述

示例

(?#comment)

在正则表达式中插入注释。匹配输入时将忽略注释文本。

'(?# Initial digit)\<\d\w+' 包括一个注释,并匹配以一个数字开头的单词。

搜索标志

搜索标志修改匹配表达式的行为。在表达式中使用搜索标志的替代方法是传递 option 输入参数。

标志

描述

(?-i)

匹配字母大小写(regexpregexprep 的默认值)。

(?i)

不匹配字母大小写(regexpi 的默认值)。

(?s)

将模式中的点 (.) 与任意字符匹配(默认值)。

(?-s)

将模式中的点与并非换行符的任意字符匹配。

(?-m)

匹配文本开头和结尾的 ^$ 元字符(默认值)。

(?m)

匹配行开头和结尾的 ^$ 元字符。

(?-x)

在匹配时包括空格字符和注释(默认值)。

(?x)

在匹配时忽略空格字符和注释。使用 '\ ''\#' 匹配空白和 # 字符。

该标志修改的表达式可显示在括号后,例如

(?i)\w*

或显示在括号内并使用冒号 (:) 与该标志分隔开,例如

(?i:\w*)

后面的语法允许您更改较大表达式的一部分的行为。

数据类型: char | cell | string

指示要返回的输出的关键字,指定为下列字符向量之一。

输出关键字

返回

'start'(默认值)

所有匹配项的开始索引,startIndex

'end'

所有匹配项的结束索引,endIndex

'tokenExtents'

所有词元的开始和结束索引

'match'

expression 中的模式匹配的每个子字符串的文本

'tokens'

str 中每个捕获的词元的文本

'names'

每个命名词元的名称和文本

'split'

str 的非匹配子字符串的文本

数据类型: char | string

搜索选项,指定为字符向量。选项成对出现:一个选项对应于默认行为,另一个选项允许您覆盖默认值。仅指定一对中的一个选项。选项可以按任意顺序显示。

默认值

覆盖

描述

'all'

'once'

尽可能多次地匹配表达式(默认值),或仅匹配一次。

'nowarnings'

'warnings'

取消警告(默认值),或显示警告。

'matchcase'

'ignorecase'

匹配字母大小写(默认值),或忽略大小写。

'noemptymatch'

'emptymatch'

忽略零长度匹配项(默认值),或包括这些匹配项。

'dotall'

'dotexceptnewline'

将点与任意字符匹配(默认值),或与除换行符 (\n) 之外的所有字符匹配。

'stringanchors'

'lineanchors'

^$ 元字符应用于字符向量的开头和结尾(默认值),或应用于行开头和结尾。换行符 (\n) 指定行的结尾。行的开头指定为第一个字符,或紧跟在换行符后面的任何字符。

'literalspacing'

'freespacing'

在匹配时包括空格字符和注释(默认值),或忽略它们。借助 freespacing,使用 '\ ''\#' 匹配空白和 # 字符。

数据类型: char | string

输出参数

全部折叠

每个匹配项的开始索引,以行向量或元胞数组的形式返回,如下所示:

  • 如果 strexpression 均为字符向量或字符串标量,则输出为行向量(或者,如果没有任何匹配项,则为空数组)。

  • 如果 strexpression 有一个是字符向量元胞数组或字符串数组,另一个是字符向量或字符串标量,则输出是行向量元胞数组。输出元胞数组与输入数组具有相同的维度。

  • 如果 strexpression 均为元胞数组或字符串数组,则它们的维度必须相同。输出是具有相同维度的元胞数组。

每个匹配项的结束索引,以行向量或元胞数组的形式返回,如下所示:

  • 如果 strexpression 均为字符向量或字符串标量,则输出为行向量(或者,如果没有任何匹配项,则为空数组)。

  • 如果 strexpression 有一个是字符向量元胞数组或字符串数组,另一个是字符向量或字符串标量,则输出是行向量元胞数组。输出元胞数组与输入数组具有相同的维度。

  • 如果 strexpression 均为元胞数组或字符串数组,则它们的维度必须相同。输出是具有相同维度的元胞数组。

有关匹配项的信息,以数值、元胞、字符串或结构体数组的形式返回。输出中的信息取决于您为 outkey 指定的值,如下所示。

输出关键字

输出描述

输出类型和维度

'start'

匹配项的开始索引

对于 'start''end'

  • 如果 strexpression 均为字符向量或字符串标量,则输出为行向量(或者,如果没有任何匹配项,则为空数组)。

  • 如果 strexpression 有一个是字符向量元胞数组或字符串数组,另一个是字符向量或字符串标量,则输出是行向量元胞数组。输出元胞数组与输入数组具有相同的维度。

  • 如果 strexpression 均为元胞数组或字符串数组,则它们的维度必须相同。输出是具有相同维度的元胞数组。

'end'

匹配项的结束索引

'tokenExtents'

所有词元的开始和结束索引

默认情况下,当返回所有匹配项时:

  • 如果 strexpression 均为字符向量或字符串标量,则输出是一个 1×n 元胞数组,其中 n 是匹配项数。每个元胞包含一个 m×2 数值索引数组,其中 m 是匹配项中的词元数。

  • 如果 strexpression 是字符向量元胞数组或字符串数组,则输出是一个与输入数组具有相同维度的元胞数组。每个元胞包含一个 1×n 元胞数组,其中每个内部元胞包含一个 m×2 数值数组。

  • 如果 strexpression 均为元胞数组或字符串数组,则它们的维度必须相同。输出是具有相同维度的元胞数组。

当指定 'once' 选项仅返回一个匹配项时,输出为一个 m×2 数值数组或一个与 str 和/或 expression 具有相同维度的元胞数组。

如果在特定索引 N 处需要词元,但未找到,则 MATLAB 返回该词元的范围 [N,N-1]

'match'

expression 中的模式匹配的每个子字符串的文本

默认情况下,当返回所有匹配项时:

  • 如果 strexpression 均为字符向量或字符串标量,则输出是一个 1×n 数组,其中 n 是匹配项数。

    如果 str 为字符向量,则输出为字符向量元胞数组。如果 str 为字符串标量,则输出为字符串数组。

  • 如果 strexpression 有一个是字符向量元胞数组或字符串数组,另一个是字符向量或字符串标量,则输出是一个元胞数组,其维数与作为数组的参数相同。

    如果 str 是字符向量或字符向量元胞数组,则输出是字符向量元胞数组。如果 str 为字符串数组,则输出为元胞数组,其中每个元胞包含一个字符串数组。

  • 如果 strexpression 均为元胞数组或字符串数组,则它们的维度必须相同。输出是具有相同维度的元胞数组。

    如果 str 为字符向量元胞数组,则输出也为字符向量元胞数组。如果 str 为字符串数组,则输出为元胞数组,其中每个元胞包含一个字符串数组。

如果您指定 'once' 选项以便只返回一个匹配项,则输出为字符向量、字符串数组或与 strexpression 具有相同维度的元胞数组。

'tokens'

str 中每个捕获的词元的文本

默认情况下,当返回所有匹配项时:

  • 如果 strexpression 均为字符向量或字符串标量,则输出是一个 1×n 元胞数组,其中 n 是匹配项数。每个元胞包含一个 1×m 匹配项元胞数组,其中 m 是匹配项中的词元数。

    如果 str 为字符向量,则输出为字符向量元胞数组。如果 str 为字符串数组,则输出为元胞数组,其中每个元胞包含一个字符串数组。

  • 如果 strexpression 有一个是字符向量元胞数组或字符串数组,另一个是字符向量或字符串标量,则输出是一个元胞数组,其维数与作为数组的参数相同。每个元胞包含一个 1×n 元胞数组,其中每个内部元胞包含一个 1×m 数组。

    如果 str 是字符向量或字符向量元胞数组,则每个内部元胞包含一个 1×m 元胞数组。如果 str 为字符串数组,则每个内部元胞包含一个 1×m 字符串数组。

  • 如果 strexpression 均为元胞数组或字符串数组,则它们的维度必须相同。输出是具有相同维度的元胞数组。

    如果 str 为字符向量元胞数组,则输出也为字符向量元胞数组。如果 str 为字符串数组,则输出为元胞数组,其中最内侧元胞包含字符串数组。

如果您指定 'once' 选项以便只返回一个匹配项,则输出为一个 1×m 字符串数组、字符向量元胞数组或与 str 和/或 expression 具有相同维度的元胞数组。

如果在特定索引处需要有词元,但未找到,MATLAB 将为词元返回空值:对于字符向量,返回 '';对于字符串,返回 ""

'names'

每个命名词元的名称和文本

对于所有匹配项:

  • 如果 strexpression 均为字符向量或字符串标量,则输出是一个 1×n 结构体数组,其中 n 是匹配项数。结构体字段名称对应于词元名称。

  • 如果 strexpression 有一个是字符向量元胞数组或字符串数组,另一个是字符向量或字符串标量,则输出是一个元胞数组,其维数与作为数组的参数相同。每个元胞包含一个 1×n 结构体数组。

  • 如果 strexpression 均为元胞数组或字符串数组,则它们的维度必须相同。输出是具有相同维度的元胞数组。

'split'

str 的非匹配子字符串的文本

对于所有匹配项:

  • 如果 strexpression 均为字符向量或字符串标量,则输出是一个 1×n 数组,其中 n 是非匹配项数。

    如果 str 为字符向量,则输出为字符向量元胞数组。如果 str 为字符串标量,则输出为字符串数组。

  • 如果 strexpression 有一个是字符向量元胞数组或字符串数组,另一个是字符向量或字符串标量,则输出是一个元胞数组,其维数与输入数组相同。每个元胞包含一个 1×n 字符向量元胞数组。

    如果 str 是字符向量或字符向量元胞数组,则输出是字符向量元胞数组。如果 str 为字符串数组,则输出为元胞数组,其中每个元胞包含一个字符串数组。

  • 如果 strexpression 均为元胞数组,则它们的维度必须相同。输出是具有相同维度的元胞数组。

    如果 str 为字符向量元胞数组,则输出也为字符向量元胞数组。如果 str 为字符串数组,则输出为元胞数组,其中每个元胞包含一个字符串数组。

详细信息

全部折叠

词元

词元是对应于正则表达式部分的匹配文本部分。要创建词元,请将正则表达式部分括在圆括号中。

例如,此表达式查找 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'

有关详细信息,请参阅正则表达式中的词元

提示

  • 可以使用 containsstrfind 查找文本中的精确字符匹配项。使用 regexp 可查找字符模式。

算法

MATLAB 从左向右解析每个输入字符向量或字符串,并尝试将该字符向量或字符串中的文本与正则表达式的第一个元素匹配。在此过程中,MATLAB 跳过不匹配的任何文本。

如果 MATLAB 发现第一部分匹配,则继续解析以匹配该表达式的第二部分,以此类推。

扩展功能

版本历史记录

在 R2006a 之前推出