正则表达式
本主题描述正则表达式是什么以及如何使用正则表达式搜索文本。正则表达式灵活而强大,尽管它们使用复杂的语法。正则表达式的替代方法是模式
(自从R2020b),这样定义起来更简单,代码也更容易阅读。有关更多信息,请参见构建模式表达式.
什么是正则表达式?
正则表达式是定义特定模式的字符序列。例如,在解析程序输入或处理文本块时,通常使用正则表达式在文本中搜索与模式匹配的一组单词。
字符向量“乔?n \ w *’
正则表达式的示例。它定义了一个以字母开头的模式乔
,后面可选跟着字母h
(“h ?”
),后面跟着字母ngydF4y2Ba
,以任意数量的单词字符,即字母、数字或下划线组成的字符“\ w *”
).此模式匹配以下任何一个:
乔恩,约翰,乔纳森,约翰尼
正则表达式提供了一种独特的方法来搜索文本卷,以查找文本中的特定字符子集。而不是像使用函数那样查找精确的字符匹配strfind
,正则表达式使您能够查找特定的模式的字符。
例如,表示度量速率的几种方法是:
Km /h Km /hr Km /hour Km /hour Km /hour Km /hour
您可以通过发出五个单独的搜索命令来查找文本中的任何上述术语:
strfind(文本、公里/小时的);strfind(文本、公里/小时的);%等。
然而,为了更高效,你可以构建一个适用于所有这些搜索词的短语:
将这个短语翻译成正则表达式(将在本节后面解释),你有:
模式=“k (ilo) ? m(一特)? (/ | \ sp \ s) h (r |我们)?”;
现在,只需一个命令就可以找到一个或多个术语:
文本= [“高铁时速250英里”,...以每小时公里的速度行驶在汽车旁,...“以每小时120公里的速度行驶。”];正则表达式(文本、模式,“匹配”)
Ans = 1×2单元格数组{'km/h'} {'km/h'}
有四个MATLAB®支持使用正则表达式搜索和替换字金宝app符的函数。前三个在它们接受的输入值和它们返回的输出值方面是相似的。详情请单击功能参考页面的链接。
函数 | 描述 |
---|---|
正则表达式 |
匹配正则表达式。 |
regexpi |
匹配正则表达式,忽略大小写。 |
regexprep |
使用正则表达式替换部分文本。 |
regexptranslate |
将文本翻译成正则表达式。 |
当调用前三个函数时,在前两个输入参数中传递要解析的文本和正则表达式。当调用regexprep
,传递一个额外的输入,该输入是指定替换模式的表达式。
构建表达式的步骤
使用正则表达式搜索特定术语的文本涉及三个步骤:
这需要将您想要搜索的文本分解成类似字符类型的组。这些字符类型可以是一系列小写字母,一个美元符号后面跟着三个数字,然后是一个小数点,等等。
使用元字符和本文档中描述的操作符,将搜索模式的每个部分表示为正则表达式。然后将这些表达式段组合到搜索中使用的单个表达式中。
本节显示的示例搜索包含属于五个朋友组的联系信息的记录。这些信息包括每个人的姓名、电话号码、居住地和电子邮件地址。目的是从文本中提取特定的信息。
联系人= {...“Harry 287-625-7315 Columbus, OH hparker@hmail.com”;...“Janice 529-882-1759加州弗雷斯诺jan_stephens@horizon.net”;...“迈克,弗吉尼亚州里士满,793-136-0975 sue_and_mike@hmail.net”;...“纳丁648-427-9947,佛罗里达州坦帕nadine_berry@horizon.net”;...“杰森·蒙特罗斯,CO, 67-336-7728 jason_blake@mymail.com”};
示例的第一部分构建了表示标准电子邮件地址格式的正则表达式。使用该表达式,该示例然后在信息中搜索朋友组之一的电子邮件地址。珍妮丝的联系方式在联系人
单元阵列:
联系人{2}
ans = 'Janice 529-882-1759弗雷斯诺,加州jan_stephens@horizon.net'
步骤1 -识别文本中的独特模式
一个典型的电子邮件地址由标准组件组成:用户的帐户名,后面跟着一个@符号,用户的互联网服务提供商(ISP)的名称,一个点(句号)和ISP所属的域。下表在左列中列出了这些组件,并在右列中概括了每个组件的格式。
电子邮件地址的独特模式 | 每个模式的一般描述 |
---|---|
从帐户名开始jan_stephens …… |
一个或多个小写字母和下划线 |
添加的@ 'jan_stephens@ …… |
@ 标志 |
添加ISPjan_stephens@horizon …… |
一个或多个小写字母,不带下划线 |
加一个点(句号)jan_stephens@horizon。 …… |
点(句号)字符 |
完成域jan_stephens@horizon.net |
com 或网 |
步骤2 -用正则表达式表达每个模式
在此步骤中,将第1步中派生的通用格式转换为正则表达式的片段。然后将这些片段加在一起形成整个表达式。
下表显示了最左边一列中每个字符模式的通用格式描述。(这是从步骤1中表的右列转过来的。)第二列显示表示字符模式的操作符或元字符。
每段描述 | 模式 |
---|---|
一个或多个小写字母和下划线 | (a-z_) + |
@ 标志 |
@ |
一个或多个小写字母,不带下划线 | [a - z] + |
点(句号)字符 | \。 |
com 或网 |
(com |网) |
将这些模式组合成一个字符向量可以得到完整的表达式:
电子邮件=“[a-z_] + @ [a - z] + \。(com |网);
步骤3 -调用适当的搜索函数
在此步骤中,您将使用第2步中派生的正则表达式来匹配该组中某个朋友的电子邮件地址。使用正则表达式
函数执行搜索。
下面是本节前面显示的联系信息列表。每个人的记录占据了一行联系人
单元阵列:
联系人= {...“Harry 287-625-7315 Columbus, OH hparker@hmail.com”;...“Janice 529-882-1759加州弗雷斯诺jan_stephens@horizon.net”;...“迈克,弗吉尼亚州里士满,793-136-0975 sue_and_mike@hmail.net”;...“纳丁648-427-9947,佛罗里达州坦帕nadine_berry@horizon.net”;...“杰森·蒙特罗斯,CO, 67-336-7728 jason_blake@mymail.com”};
这是表示电子邮件地址的正则表达式,由步骤2派生:
电子邮件=“[a-z_] + @ [a - z] + \。(com |网);
调用正则表达式
函数的第2行联系人
单元格数组和电子邮件
正则表达式。这将返回Janice的电子邮件地址。
正则表达式(联系人{2},电子邮件,“匹配”)
Ans = 1×1单元格数组{'jan_stephens@horizon.net'}
MATLAB从左到右解析字符向量,“消耗”向量。如果找到匹配的字符,正则表达式
记录位置并继续解析字符向量,从最近一次匹配结束后开始。
打同样的电话,但这次是给名单上的第五个人:
正则表达式(联系人{5},电子邮件,“匹配”)
Ans = 1×1单元格数组{'jason_blake@mymail.com'}
你也可以通过输入参数使用整个单元格数组来搜索列表中每个人的电子邮件地址:
正则表达式(联系人、邮件、“匹配”);
操作符和字符
正则表达式可以包含字符、元字符、操作符、令牌和指定匹配模式的标志,如以下部分所述:
元字符
元字符表示字母、字母范围、数字和空格字符。用它们来构造一个一般的字符模式。
元字符 |
描述 |
例子 |
---|---|---|
|
任何单个字符,包括空白 |
|
|
方括号内的任何字符。以下字符按字面意思处理: |
|
|
任何不包含在方括号内的字符。以下字符按字面意思处理: |
|
|
范围内的任何字符 |
|
|
任何字母、数字或下划线字符。对于英文字符集, |
|
|
不是字母、数字或下划线的任何字符。对于英文字符集, |
|
|
任何空白字符;相当于 |
|
|
任何非空白字符;相当于 |
|
|
任何数字;相当于 |
|
|
任何非数字字符;相当于 |
|
|
八进制值的字符 |
|
|
十六进制值的字符 |
|
字符表示
操作符 |
描述 |
---|---|
|
报警(嘟) |
|
退格 |
|
换页 |
|
新行 |
|
回车 |
|
水平选项卡 |
|
垂直制表符 |
|
正则表达式中任何具有特殊含义的字符,您希望从字面上匹配(例如,使用 |
量词
量词指定模式必须在匹配文本中出现的次数。
量词 |
表达式出现的次数 |
例子 |
---|---|---|
|
连续0次或多次。 |
|
|
0次或1次。 |
|
|
连续1次或以上。 |
|
|
至少
|
|
|
至少
|
|
|
完全 相当于 |
|
量词可以以三种模式出现,如下表所示。问表示上表中的任何量词。
模式 |
描述 |
例子 |
||||
---|---|---|---|---|---|---|
|
贪心表达式:匹配尽可能多的字符。 |
给定文本
|
||||
|
惰性表达式:匹配尽可能少的字符。 |
给定文本
|
分组操作符
分组操作符允许您捕获令牌,将一个操作符应用到多个元素,或禁用特定组中的回溯。
分组操作符 |
描述 |
例子 |
---|---|---|
|
对表达式元素和捕获令牌进行分组。 |
|
|
组,但不捕获令牌。 |
没有分组, |
|
组自动。不要在组内回溯以完成匹配,也不要捕获令牌。 |
|
|
匹配表达式 如果有匹配 你可以包括 |
|
锚
表达式中的锚与字符向量或单词的开头或结尾匹配。
锚 |
匹配…… |
例子 |
---|---|---|
|
输入文本的开头。 |
|
|
输入文本结束。 |
|
|
一个单词的开头。 |
|
|
一个词的结尾。 |
|
看看断言
环视断言查找紧接在预期匹配之前或之后的模式,但不是匹配的一部分。
指针保持在当前位置,与之对应的字符测验
表达式不会被捕获或丢弃。因此,前向断言可以匹配重叠的字符组。
看看断言 |
描述 |
例子 |
---|---|---|
|
提前寻找匹配的角色 |
|
|
提前寻找不匹配的字符 |
|
|
在后面寻找匹配的字符 |
|
|
寻找不匹配的字符 |
|
如果指定了超前断言之前一个表达式,其操作相当于一个逻辑和
.
操作 |
描述 |
例子 |
---|---|---|
|
匹配两个 |
|
|
匹配 |
|
有关更多信息,请参见正则表达式中的超前断言.
逻辑和条件运算符
逻辑和条件操作符允许您测试给定条件的状态,然后使用结果确定下一个匹配的模式(如果有的话)。这些操作符支持逻辑金宝app或
而且如果
或如果/其他
条件。(和
条件,请参阅看看断言)。
条件可以是令牌,看看断言,或动态表情形式的(? @cmd)
.动态表达式必须返回逻辑值或数值。
条件运算符 |
描述 |
例子 |
---|---|---|
|
匹配表达式 如果有匹配 |
|
|
如果条件 |
|
|
如果条件 |
|
令牌运营商
令牌是通过将部分正则表达式括在括号中定义的匹配文本的一部分。您可以通过文本中的序列(序数标记)引用标记,或者为标记分配名称,以便于代码维护和可读输出。
序号令牌运算符 |
描述 |
例子 |
---|---|---|
|
在标记中捕获与所包含表达式匹配的字符。 |
|
|
匹配 |
|
|
如果 |
|
命名令牌运算符 |
描述 |
例子 |
---|---|---|
|
在命名标记中捕获与括起来的表达式匹配的字符。 |
|
|
所引用的令牌匹配 |
|
|
如果找到命名令牌,则进行匹配 |
|
请注意
如果表达式有嵌套的括号,MATLAB将捕获对应于最外层括号集的标记。例如,给定搜索模式”(和(y |奖赏))”
, MATLAB创建一个令牌“安德鲁”
但不是为了“y”
或“报答”
.
有关更多信息,请参见正则表达式中的令牌.
动态表情
动态表达式允许您执行MATLAB命令或正则表达式来确定要匹配的文本。
包含动态表达式的括号可以不创建捕获组。
操作符 |
描述 |
例子 |
---|---|---|
|
解析 当解析, |
|
|
执行代表的MATLAB命令 |
|
|
执行代表的MATLAB命令 |
|
在动态表达式中,使用以下操作符定义替换项。
替换操作符 |
描述 |
---|---|
|
当前匹配的输入文本的一部分 |
|
当前匹配之前的输入文本的一部分 |
|
当前匹配后的部分输入文本(使用 |
|
|
|
叫牌 |
|
当MATLAB执行命令时返回的输出, |
有关更多信息,请参见动态正则表达式.
评论
的评论
操作符使您能够在代码中插入注释,使其更易于维护。注释的文本在与输入文本匹配时被MATLAB忽略。
字符 |
描述 |
例子 |
---|---|---|
(? #评论) |
在正则表达式中插入注释。在匹配输入时,注释文本将被忽略。 |
|
搜索的旗帜
搜索标志修改匹配表达式的行为。
国旗 |
描述 |
---|---|
(? -我) |
匹配字母大小写(默认为 |
(我)? |
不匹配字母大小写(默认为 |
(?) |
匹配点( |
(? - s) |
将模式中的dot与任何非换行符的字符匹配。 |
(? - m) |
匹配 |
(?) |
匹配 |
(? - x) |
匹配时包括空格字符和注释(默认)。 |
x (?) |
匹配时忽略空格字符和注释。使用 |
该标志修改的表达式可以出现在括号之后,例如
(?我)\ w *
或者在括号内,用冒号与标志分隔开(:
),例如
(?我:\ w *)
后一种语法允许您更改较大表达式部分的行为。
另请参阅
正则表达式
|regexpi
|regexprep
|regexptranslate
|模式