介绍正则表达式的含义以及如何使用正则表达式搜索文本。尽管正则表达式使用复杂的语法,但它灵活而强大。正则表达式的另一种替代方法是模式
(自R2020B以来),它更易于定义,并生成更易于阅读的代码。有关详细信息,请参阅构建模式表达式.
正则表达式是定义特定模式的字符序列。通常,在解析程序输入或处理文本块时,使用正则表达式搜索与模式匹配的一组单词。
特征向量“乔?n \ w *’
是正则表达式的一个示例。它定义了一个以字母开头的模式乔
,可选择后跟字母H
(表示“h?”
),然后是字母NG.ydF4y2Ba
,以任意数量的单词字符,即字母、数字或下划线字符(由“\w*”
)。此模式与以下任何一项匹配:
约翰,约翰,乔纳森,约翰
正则表达式提供了一种独特的方法,可以在文本中搜索特定的字符子集。而不是寻找一个精确的字符匹配,你会做的函数斯特芬德
,正则表达式为您提供了寻找特定的能力模式人物。
例如,表示公制速度的几种方式有:
公里/小时公里/小时公里/小时公里/小时公里/小时
你可以通过发出五个单独的搜索命令在你的文本中找到上述任何一个术语:
strfind(文字,“公里/小时”);strfind(文字,'km / hore');% 等等。
但是,为了提高效率,您可以构建一个适用于所有这些搜索词的短语:
将这个短语翻译成正则表达式(将在本节后面解释),你就得到:
模式=“k (ilo) ? m(一特)? (/ | \ sp \ s) h (r |我们)?”;
现在,只需使用一个命令即可找到一个或多个术语:
文本= [“高速列车以250英里的速度行驶”,...“每小时沿着汽车”,...以每小时120公里的速度行驶。];正则表达式(文本、模式,“匹配”)
ans=1×2单元阵列{'km/h'}{'km/h'}
有四个matlab®支持使用正则表达式搜索和替换字金宝app符的函数。前三种方法在接受的输入值和返回的输出值方面是相似的。具体操作请单击功能参考页面的链接。
功能 | 描述 |
---|---|
regexp. |
匹配正则表达式。 |
正则表达式 |
匹配正则表达式,忽略大小写。 |
regexprep |
使用正则表达式替换一部分文本。 |
regexptranslate |
将文本转换为正则表达式。 |
调用前三个函数中的任何一个时,通过要解析的文本和前两个输入参数中的正则表达式。在呼唤时regexprep
,传递一个额外的输入,该输入是指定替换模式的表达式。
使用正则表达式搜索特定词汇的文本涉及三个步骤:
这需要将您想要搜索的文本分成类似字符类型的组。这些字符类型可以是一系列小写字母,一个美元符号后面跟着三个数字,然后是一个小数点,等等。
使用元字符和本文档中描述的运算符将搜索模式的每个段表达为正则表达式。然后将这些表达段组合到单个表达式中以在搜索中使用。
本节中所示的示例搜索包含属于五个朋友组的联系信息的记录。此信息包括每个人的姓名,电话号码,居住地和电子邮件地址。目标是从文本中提取特定信息..
联系人= {...“哈里287-625-7315哥伦布,哦hparker@hmail.com';..."贾尼斯529-882-1759弗雷斯诺加州jan_stephens@horizon.net ";...'Mike 793-136-0975里士满,弗吉尼亚州sue_and_mike@hmail.net';...'Nadine 648-427-9947 Tampa,fl nadine_berry@horizon.net';...'Jason 697-336-7728 Montrose, CO jason_blake@mymail.com'};
示例的第一部分构建了一个正则表达式,它表示标准电子邮件地址的格式。然后,该示例使用该表达式搜索其中一个朋友组的电子邮件地址信息。贾尼斯的联系方式在第二排联系人
单元阵列:
联系人{2}
ans='Janice 529-882-1759弗雷斯诺,加利福尼亚州_stephens@horizon.net'
一个典型的电子邮件地址是由标准组件组成的:用户的帐户名,后跟@符号,用户的互联网服务提供商(ISP)的名称,点(句点),以及ISP所属的域。下表在左侧列中列出了这些组件,在右侧列中概括了每个组件的格式。
电子邮件地址的独特模式 | 每个模式的一般描述 |
---|---|
从帐户名开始Jan_Stephens. 。 |
一个或多个小写字母和下划线 |
添加的@ 'jan_stephens@ 。 |
@ 标志 |
添加ISP一月_stephens@horizon 。 |
一个或多个小写字母,没有下划线 |
添加一个点(句号)jan_stephens@horizon。 。 |
点(段)字符 |
完成域一月_stephens@horizon.net |
com 或网 |
在此步骤中,将第1步中派生的一般格式转换为正则表达式的片段。然后把这些片段加在一起,形成整个表达式。
下表显示了左列列中每个字符模式的广义格式描述。(这是从第1步中表的右栏向前推送的。)第二列显示表示字符模式的操作员或元字符。
每段描述 | 模式 |
---|---|
一个或多个小写字母和下划线 | [A-Z _] + |
@ 标志 |
@ |
一个或多个小写字母,没有下划线 | [a - z] + |
点(段)字符 | \。 |
com 或网 |
(com | net) |
将这些模式组合到一个字符向量中可以得到完整的表达式:
电子邮件=“[a-z_] + @ [a - z] + \。(com |网);
在此步骤中,使用步骤2中派生的正则表达式来匹配组中一个朋友的电子邮件地址。使用regexp.
函数执行搜索。
这是本节前面显示的联系信息列表。每个人的记录占据了联系人
单元阵列:
联系人= {...“哈里287-625-7315哥伦布,哦hparker@hmail.com';..."贾尼斯529-882-1759弗雷斯诺加州jan_stephens@horizon.net ";...'Mike 793-136-0975里士满,弗吉尼亚州sue_and_mike@hmail.net';...'Nadine 648-427-9947 Tampa,fl nadine_berry@horizon.net';...'Jason 697-336-7728 Montrose, CO jason_blake@mymail.com'};
这是表示电子邮件地址的正则表达式,如步骤2所派生的:
电子邮件=“[a-z_] + @ [a - z] + \。(com |网);
调用regexp.
功能,通过第2行联系人
单元阵列和电子邮件
正则表达式。返回Janice的电子邮件地址。
Regexp(联系人{2},电子邮件,“匹配”)
Ans = 1×1 cell array {'jan_stephens@horizon.net'}
matlab将一个字符向量解析为左右,“消耗”向量。如果找到匹配字符,regexp.
记录位置并继续解析字符向量,从最近匹配结束后开始。
打同样的电话,但这次是给名单上的第五个人:
regexp(联系人{5},电子邮件,“匹配”)
Ans = 1×1 cell array {'jason_blake@mymail.com'}
你也可以通过使用整个单元格数组作为输入参数来搜索列表中每个人的电子邮件地址:
regexp(联系人、电子邮件、,“匹配”);
正则表达式可以包含指定要匹配的模式的字符、元字符、操作符、令牌和标志,如以下部分所述:
元字符代表字母、字母范围、数字和空格字符。用它们来构造一个通用的字符模式。
metacharacter |
描述 |
例子 |
---|---|---|
|
任何单个字符,包括空白 |
|
|
方形括号内包含的任何字符。字面上对待以下字符: |
|
|
方括号内不包含的任何字符。字面上对待以下字符: |
|
|
范围内的任何字符 |
|
|
任何字母、数字或下划线字符。对于英文字符集, |
|
|
任何非字母、数字或下划线的字符。对于英文字符集, |
|
|
任何空白字符;相当于 |
|
|
任何非空白空间字符;相当于 |
|
|
任何数字;相当于 |
|
|
任何非数字字符;相当于 |
|
|
八进制值的特征 |
|
|
十六进制值字符 |
|
操作符 |
描述 |
---|---|
|
报警(嘟) |
|
退格 |
|
饲料 |
|
新线 |
|
回车 |
|
水平选项卡 |
|
垂直制表符 |
|
任何具有特殊含义的字符,在详细信息中,您想要匹配的正则表达式(例如,使用 |
量词指定模式必须在匹配文本中出现的次数。
量词 |
表达式发生的次数 |
例子 |
---|---|---|
|
连续0次或更多次。 |
|
|
0乘以1乘以。 |
|
|
连续1次或多次。 |
|
|
至少
|
|
|
至少
|
|
|
确切地 相当于 |
|
量词可以以三种模式出现,如下表所述。Q表示上表中的任何量词。
模式 |
描述 |
例子 |
||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
|
贪婪表达式:匹配尽可能多的字符。 |
给定文本 文本”, 表达方式 文本”
惰性表达式:匹配尽可能少的字符。 给定文本 文本”, 表达方式 占有表达:尽可能匹配,但不要重新扫描文本的任何一部分。 给定文本 文本”, 表达方式 |
分组运算符允许您捕获令牌,将一个运算符应用于多个元素,或在特定组中禁用回溯。
分组运营商 |
描述 |
例子 |
---|---|---|
|
对表达式的元素进行分组并捕获标记。 |
|
|
组,但不捕获令牌。 |
没有分组, |
|
原子群。不要在组内回溯以完成匹配,也不要捕获令牌。 |
|
|
匹配表达式 如果有匹配 您可以包括 |
|
表达式中的锚匹配字符向量或单词的开头或结尾。
锚 |
匹配…… |
例子 |
---|---|---|
|
输入文本的开头。 |
|
|
输入文本的结束。 |
|
|
一个词的开始。 |
|
|
一个单词的结尾。 |
|
环视断言查找紧跟在预期匹配之前或之后但不属于匹配部分的模式。
指针保持在当前位置,而对应于测验
表达式不会被捕获或丢弃。因此,前向断言可以匹配重叠的字符组。
看看断言 |
描述 |
例子 |
---|---|---|
|
向前查找匹配的字符 |
|
|
提前查找不匹配的字符 |
|
|
在后面查找匹配的字符 |
|
|
在后面查找不匹配的字符 |
|
如果指定了前向断言之前一个表达式,相当于一个逻辑运算和
.
操作 |
描述 |
例子 |
---|---|---|
|
匹配两个 |
|
|
比赛 |
|
有关更多信息,请参见正则表达式的寻道士断言.
逻辑运算符和条件运算符允许您测试给定条件的状态,然后使用结果来确定下一个匹配的模式(如果有的话)。这些操作符支持逻辑的金宝app或
和如果
或如果别的
条件。(和
条件,请参阅PookAround断言。)
条件可以令牌,PookAround断言,或动态表情的形式(?@cmd)
.动态表达式必须返回逻辑或数字值。
条件运算符 |
描述 |
例子 |
---|---|---|
|
匹配表达式 如果有匹配 |
|
|
如果条件 |
|
|
如果条件 |
|
令牌是通过将正则表达式的一部分括在括号中定义的匹配文本的一部分。您可以通过标记在文本中的顺序(序数标记)引用标记,或者为标记分配名称,以便于代码维护和输出可读。
序数标记运算符 |
描述 |
例子 |
---|---|---|
|
在标记中捕获与括起来的表达式匹配的字符。 |
|
|
匹配 |
|
|
如果是 |
|
叫牌运营商 |
描述 |
例子 |
---|---|---|
|
在命名标记中捕获与所包含表达式匹配的字符。 |
|
|
匹配引用的令牌 |
|
|
如果找到指定的令牌,则匹配 |
|
笔记
如果表达式具有嵌套括号,则MATLAB捕获对应于对应于最外侧括号组的令牌。例如,给定搜索模式”(和(y |奖赏))”
, MATLAB创建令牌“安德鲁”
但不是为了'是'
或“报答”
.
有关更多信息,请参见正则表达式中的令牌.
动态表达式允许您执行MATLAB命令或正则表达式来确定要匹配的文本。
动态表达式的括号不创建捕获组。
操作符 |
描述 |
例子 |
---|---|---|
|
解析 当解析, |
|
|
执行由以下表达式表示的MATLAB命令 |
|
|
执行由以下表达式表示的MATLAB命令 |
|
在动态表达式中,使用下列操作符来定义替换项。
替换操作员 |
描述 |
---|---|
|
当前匹配的输入文本的部分 |
|
当前匹配之前的输入文本部分 |
|
当前匹配后面的输入文本的一部分(使用 |
|
|
|
叫牌 |
|
MATLAB执行命令时返回的输出, |
有关更多信息,请参见动态正则表达式.
这个评论
操作符允许您在代码中插入注释,以使其更易于维护。当与输入文本进行匹配时,注释的文本被MATLAB忽略。
字符 |
描述 |
例子 |
---|---|---|
(?#评论) |
在正则表达式中插入注释。匹配输入时将忽略注释文本。 |
|
搜索标志修改匹配表达式的行为。
国旗 |
描述 |
---|---|
(? -我) |
匹配字母大小写(默认为 |
(?一) |
不匹配字母大小写(默认为 |
(?s) |
匹配点( |
(?-s) |
将图案中的点与非换行符的任何字符匹配。 |
(? - m) |
匹配 |
(?m) |
匹配 |
(?-X) |
在匹配时包括空格字符和注释(默认)。 |
x (?) |
匹配时忽略空格字符和注释。使用 |
标志修改的表达式可以在括号之后出现,例如
(?i)\ w *
或在括号内,并用冒号与标志分隔(:
),比如
(?i:\w*)
后一种语法允许您更改较大表达式的一部分的行为。
regexp.
|正则表达式
|regexprep
|regexptranslate
|模式