本主题介绍了正则表达式是什么以及如何将它们用于搜索文本。常规表达式灵活且功能强大,但它们使用复杂语法。常规表达式的替代方案是一个图案
(自从R2020b),它更容易定义,并使代码更容易阅读。有关更多信息,请参见构建模式表达式.
正则表达式是定义某种模式的字符序列。通常使用正则表达式在文本中搜索匹配模式的一组单词,例如,在解析程序输入或处理文本块时。
特征向量'joh?n \ w *'
是正则表达式的一个示例。它定义了一个以字母开头的模式乔
,后面可选加字母h
(“h ?”
),然后是字母议员ydF4y2Ba
,以任意数量的字符字符,即字母、数字或下划线字符(由“\ w *”
).该模式匹配以下任何一个:
约翰,约翰,乔纳森,约翰
正则表达式提供了一种独特的方法,可以在该文本中搜索一段特定字符子集的文本。与您一样,而不是寻找确切的字符匹配strfind
,正则表达式提供了查找特定对象的能力图案的字符。
例如,表示公制速率的几种方法有:
公里/小时公里/小时公里/小时公里/小时公里每小时
您可以通过发出五个单独的搜索命令在文本中找到任何上述术语:
strfind(文本、公里/小时的);strfind(文本、公里/小时的);%等。
然而,为了更有效,你可以构建一个适用于所有这些搜索词的短语:
将此短语翻译成正则表达式(要在本节后面解释),并且您有:
模式=“k (ilo) ? m(一特)? (/ | \ sp \ s) h (r |我们)?”;
现在只需使用一个命令就可以定位一个或多个术语:
text = [“高速列车以250英里的速度行驶”,...“汽车旁边的时速”,...'以120 km / h旅行。];regexp(文本,模式,'比赛')
Ans = 1×2 cell array {'km/h'} {'km/h'}
有四个MATLAB®支持使用正则表达式搜索和替换字金宝app符的函数。前三种方法在接受的输入值和返回的输出值方面是相似的。具体操作请单击功能参考页面的链接。
函数 | 描述 |
---|---|
正则表达式 |
匹配正则表达式。 |
regexpi |
匹配正则表达式,忽略大小写。 |
regexprep |
使用正则表达式替换部分文本。 |
regexptranslate |
将文本转换为正则表达式。 |
当调用前三个函数中的任何一个时,在前两个输入参数中传递要解析的文本和正则表达式。当调用regexprep
,传递一个额外的输入,该输入是指定替换模式的表达式。
使用正则表达式有三个步骤,以获取特定术语的文本:
这需要将您想要搜索的文本分成类似字符类型的组。这些字符类型可以是一系列小写字母,一个美元符号后面跟着三个数字,然后是一个小数点,等等。
使用元字符以及本文档中描述的操作符,以将搜索模式的每个部分表示为正则表达式。然后将这些表达式段合并成单个表达式用于搜索。
本节中显示的示例搜索一条记录,该记录包含属于一个由5个朋友组成的群组的联系信息。这些信息包括每个人的姓名、电话号码、居住地和电子邮件地址。目标是从文本中提取特定的信息。
联系人= {...“哈里287-625-7315哥伦布,OH hparker@hmail.com”;..."贾尼斯529-882-1759弗雷斯诺加州jan_stephens@horizon.net ";...'迈克793-136-0975里士满,va sue_and_mike@hmail.net';...'Nadine 648-427-9947 Tampa, FL nadine_berry@horizon.net';...'杰森697-336-7728蒙特罗斯,Co Jason_Blake@mymail.com'};
该示例的第一部分构建了一个正则表达式,表示标准电子邮件地址的格式。使用该表达式,该示例然后搜索其中一个朋友的电子邮件地址的信息。Janice的联系方式是第2行联系人
单元格阵列:
联系人{2}
ans = 'Janice 529-882-1759加州弗雷斯诺jan_stephens@horizon.net'
典型的电子邮件地址由标准组件组成:用户的帐户名称,后跟@ sign,用户的Internet服务提供商(ISP)的名称,DOT(时段)以及ISP所属的域。下表在左栏中列出了这些组件,并概括了右栏中每个组件的格式。
电子邮件地址的唯一模式 | 每个模式的一般描述 |
---|---|
从帐户名称开始jan_stephens ... |
一个或多个小写字母和下划线 |
添加 '@ 'Jan_Stephens @ ... |
@ 标志 |
添加ISPjan_stephens@horizon ... |
一个或多个小写字母,没有下划线 |
添加点(期间)Jan_Stephens @ Horizo n。 ... |
点(时期)字符 |
完成域jan_stephens@horizon.net |
com 或净 |
在此步骤中,将第1步中派生的一般格式转换为正则表达式的片段。然后把这些片段加在一起,形成整个表达式。
下表显示了最左边一列中每个字符模式的通用格式描述。(这是在步骤1中从表的右边一列进行的。)第二列显示表示字符模式的操作符或元字符。
每段描述 | 图案 |
---|---|
一个或多个小写字母和下划线 | (a-z_) + |
@ 标志 |
@ |
一个或多个小写字母,没有下划线 | [a - z] + |
点(时期)字符 | \。 |
com 或净 |
(com |网) |
将这些模式组合成一个字符向量就可以得到完整的表达式:
电子邮件='[a-z _] + @ [a-z] + \。(com | net)';
在此步骤中,使用步骤2中派生的正则表达式来匹配组中一个朋友的电子邮件地址。使用正则表达式
函数来执行搜索。
下面是本节前面显示的联系信息列表。每个人的记录占据一行联系人
单元格阵列:
联系人= {...“哈里287-625-7315哥伦布,OH hparker@hmail.com”;..."贾尼斯529-882-1759弗雷斯诺加州jan_stephens@horizon.net ";...'迈克793-136-0975里士满,va sue_and_mike@hmail.net';...'Nadine 648-427-9947 Tampa, FL nadine_berry@horizon.net';...'杰森697-336-7728蒙特罗斯,Co Jason_Blake@mymail.com'};
这是表示电子邮件地址的正则表达式,如第2步派生的:
电子邮件='[a-z _] + @ [a-z] + \。(com | net)';
调用正则表达式
函数的第2行联系人
单元格数组电子邮件
正则表达式。这是贾尼斯的邮箱地址。
正则表达式(联系人{2},电子邮件,'比赛')
ans = 1×1个单元阵列{'jan_stphens@horizon.net'}
MATLAB从左到右解析一个字符向量,“消费”这个向量。如果找到匹配的字符,正则表达式
记录位置并在最近的匹配结束后开始解析字符向量。
打同样的电话,但这次是给名单上的第五个人:
正则表达式(联系人{5},电子邮件,'比赛')
ans = 1×1个单元阵列{'jason_blake@mymail.com'}
您还可以使用输入参数的整个单元格数组搜索列表中每个人的电子邮件地址:
正则表达式(联系人、邮件、'比赛');
正则表达式可以包含指定模式以匹配的字符,元字符,运算符,令牌和标志,如这些部分中所述:
元字符代表字母、字母范围、数字和空格字符。用它们来构造一个通用的字符模式。
元字符 |
描述 |
例子 |
---|---|---|
|
任何单个字符,包括空白 |
|
|
方括号内包含的任何字符。以下字符按字面意思处理: |
|
|
方括号内不包含的任何字符。以下字符按字面意思处理: |
|
|
范围内的任何角色 |
|
|
任何字母、数字或下划线字符。对于英文字符集, |
|
|
任何不是字母,数字或下划线的字符。对于英文字符集, |
|
|
任何空白字符;相当于 |
|
|
任何非空白字符;相当于 |
|
|
任何数字;相当于 |
|
|
任何数字字符;相当于 |
|
|
八万价值的特征 |
|
|
十六进制值的特征 |
|
操作符 |
描述 |
---|---|
|
警报(哔哔) |
|
退格 |
|
换页 |
|
新行 |
|
回车 |
|
水平标签 |
|
垂直标签 |
|
任何在正则表达式中具有特殊含义的字符,您希望按字面意义匹配(例如,use |
限定符指定模式在匹配文本中必须出现的次数。
量词 |
发生的次数 |
例子 |
---|---|---|
|
连续0次或更多次。 |
|
|
0次或1次。 |
|
|
连续1次或更多。 |
|
|
至少
|
|
|
至少
|
|
|
完全 相当于 |
|
量词可以以三种方式出现,如下表所示。问表示上一表中的任何量词。
模式 |
描述 |
例子 |
||||
---|---|---|---|---|---|---|
|
贪婪表达式:匹配尽可能多的字符。 |
考虑到文本
|
||||
|
懒惰的表达:必要时匹配很少的字符。 |
考虑到文本
|
分组操作符允许您捕获令牌、将一个操作符应用于多个元素或在特定组中禁用回溯。
分组操作符 |
描述 |
例子 |
---|---|---|
|
对表达式和捕获标记的元素进行分组。 |
|
|
组,但不捕获令牌。 |
没有分组, |
|
组自动。不要在组内回溯以完成匹配,也不要捕获令牌。 |
|
|
匹配表达式 如果有匹配 你可以包括 |
|
表达式中的锚匹配字符向量或单词的开头或结尾。
锚 |
匹配...... |
例子 |
---|---|---|
|
输入文本的开头。 |
|
|
输入文本的结尾。 |
|
|
单词的开头。 |
|
|
一个词的结尾。 |
|
LookAround断言查找立即在预期匹配之前立即或遵循预期匹配的模式,但不是匹配的一部分。
指针仍然存在于当前位置,并且与对应的字符测试
表达式不会被捕获或丢弃。因此,前向断言可以匹配重叠的字符组。
PookAround断言 |
描述 |
例子 |
---|---|---|
|
向前查找匹配的字符 |
|
|
提前查找不匹配的字符 |
|
|
查找匹配的字符 |
|
|
查找不匹配的字符 |
|
如果您指定了一个看法断言前一个表达式,相当于一个逻辑运算和
.
手术 |
描述 |
例子 |
---|---|---|
|
匹配两者 |
|
|
匹配 |
|
有关更多信息,请参见正则表达式中的超前断言.
逻辑运算符和条件运算符允许您测试给定条件的状态,然后使用结果来确定下一个匹配的模式(如果有的话)。这些操作符支持逻辑的金宝app或
和如果
或如果/其他
状况。(为了和
条件,请参阅看看断言.)
条件可以令牌,看看断言,或动态表情的形式(? @cmd)
.动态表达式必须返回逻辑或数值。
条件运营商 |
描述 |
例子 |
---|---|---|
|
匹配表达式 如果有匹配 |
|
|
如果条件 |
|
|
如果条件 |
|
令牌是通过将正则表达式的一部分括在括号中定义的匹配文本的一部分。您可以通过标记在文本中的顺序(序数标记)引用标记,或者为标记分配名称,以便于代码维护和输出可读。
序数牌运营商 |
描述 |
例子 |
---|---|---|
|
在令牌中捕获符合随附表达式的字符。 |
|
|
匹配 |
|
|
如果 |
|
叫牌运营商 |
描述 |
例子 |
---|---|---|
|
捕获命名令牌符合随附表达式的字符。 |
|
|
匹配引用的令牌 |
|
|
如果找到指定的令牌,则进行匹配 |
|
请注意
如果表达式有嵌套的括号,MATLAB会捕获与最外层括号集对应的标记。例如,给定搜索模式”(和(y |奖赏))”
, MATLAB创建令牌'安德鲁'
但不是“y”
或'rew'
.
有关更多信息,请参见正则表达式的令牌.
动态表达式允许您执行MATLAB命令或正则表达式来确定要匹配的文本。
动态表达式的括号不是创建捕获组。
操作符 |
描述 |
例子 |
---|---|---|
|
解析 解析后, |
|
|
执行表示的MATLAB命令 |
|
|
执行表示的MATLAB命令 |
|
在动态表达式中,使用以下运算符定义替换项。
替换操作符 |
描述 |
---|---|
|
当前匹配的输入文本的一部分 |
|
当前匹配之前的输入文本的一部分 |
|
当前匹配后面的输入文本的一部分(使用 |
|
|
|
命名为令牌 |
|
当MATLAB执行命令时返回的输出, |
有关更多信息,请参见动态的正则表达式.
的评论
操作员使您可以将注释插入代码中以使其更可维护。Matlab匹配输入文本时,Matlab忽略了评论的文本。
人物 |
描述 |
例子 |
---|---|---|
(? #评论) |
在正则表达式中插入注释。当匹配输入时,注释文本被忽略。 |
|
搜索标志修改匹配表达式的行为。
旗帜 |
描述 |
---|---|
(?-一世) |
匹配信箱(默认为 |
(我)? |
不匹配字母大小写(默认为 |
(?) |
匹配点( |
(? - s) |
用非换行符的任何字符匹配模式中的点。 |
(?-m) |
匹配 |
(?) |
匹配 |
(? - x) |
包括匹配时的空格字符和注释(默认值)。 |
x (?) |
匹配时忽略空格字符和注释。使用 |
标志修改的表达式可以出现在括号后面,例如
(?我)\ w *
或在括号内,用冒号与标志分开(:
), 如
(?我:\ w *)
后一种语法允许您更改较大表达式的部分行为。
正则表达式
|regexpi
|regexprep
|regexptranslate
|图案