主要内容

正则表达式

介绍正则表达式的含义以及如何使用正则表达式搜索文本。尽管正则表达式使用复杂的语法,但它灵活而强大。正则表达式的另一种替代方法是模式(自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,传递一个额外的输入,该输入是指定替换模式的表达式。

构建表达式的步骤

使用正则表达式搜索特定词汇的文本涉及三个步骤:

  1. 确定字符串中唯一的模式

    这需要将您想要搜索的文本分成类似字符类型的组。这些字符类型可以是一系列小写字母,一个美元符号后面跟着三个数字,然后是一个小数点,等等。

  2. 将每个模式表达为正则表达式

    使用元字符和本文档中描述的运算符将搜索模式的每个段表达为正则表达式。然后将这些表达段组合到单个表达式中以在搜索中使用。

  3. 调用适当的搜索函数

    传递要解析为搜索功能之一的文本,例如regexp.正则表达式,或文本替换函数,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@horizo​​n.net';...'Jason 697-336-7728 Montrose, CO jason_blake@mymail.com'};

示例的第一部分构建了一个正则表达式,它表示标准电子邮件地址的格式。然后,该示例使用该表达式搜索其中一个朋友组的电子邮件地址信息。贾尼斯的联系方式在第二排联系人单元阵列:

联系人{2}
ans='Janice 529-882-1759弗雷斯诺,加利福尼亚州_stephens@horizon.net'

第1步-确定文本中的独特模式

一个典型的电子邮件地址是由标准组件组成的:用户的帐户名,后跟@符号,用户的互联网服务提供商(ISP)的名称,点(句点),以及ISP所属的域。下表在左侧列中列出了这些组件,在右侧列中概括了每个组件的格式。

电子邮件地址的独特模式 每个模式的一般描述
从帐户名开始
Jan_Stephens.
一个或多个小写字母和下划线
添加的@'
jan_stephens@
@标志
添加ISP
一月_stephens@horizon
一个或多个小写字母,没有下划线
添加一个点(句号)
jan_stephens@horizon。
点(段)字符
完成域
一月_stephens@horizon.net
com

步骤2 -将每个模式表达为正则表达式

在此步骤中,将第1步中派生的一般格式转换为正则表达式的片段。然后把这些片段加在一起,形成整个表达式。

下表显示了左列列中每个字符模式的广义格式描述。(这是从第1步中表的右栏向前推送的。)第二列显示表示字符模式的操作员或元字符。

每段描述 模式
一个或多个小写字母和下划线 [A-Z _] +
@标志 @
一个或多个小写字母,没有下划线 [a - z] +
点(段)字符 \。
com (com | net)

将这些模式组合到一个字符向量中可以得到完整的表达式:

电子邮件=“[a-z_] + @ [a - z] + \。(com |网);

步骤3 -调用适当的搜索功能

在此步骤中,使用步骤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@horizo​​n.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

描述

例子

任何单个字符,包括空白

“……不是吗匹配以结尾的五个连续字符的序列“是”

[c1.C2.C3.]

方形括号内包含的任何字符。字面上对待以下字符:$ |.* +?-当不用于指示范围时。

“[rp.]没有匹配“雨”“痛苦””“没有

[^ C.1.C2.C3.]

方括号内不包含的任何字符。字面上对待以下字符:$ |.* +?-当不用于指示范围时。

'[^ * rp] ain'匹配所有以。结尾的四字母序列“是”, 除了“雨”“痛苦”‘*是‘.例如,它匹配“收益”,“躺”,或“虚荣”

[c1.- c2.]

范围内的任何字符C1.通过C2.

“[g]”匹配范围内的单个字符A.通过G

\ w

任何字母、数字或下划线字符。对于英文字符集,\ w相当于[A-ZA-Z_0-9]

“\w*”标识由任何组成的字母,数字或下划线组成的单词。

\ W

任何非字母、数字或下划线的字符。对于英文字符集,\ W相当于[^ a-za-z_0-9]

“\W*”标识不是由任何字母、数字或下划线字符组组成的单词的术语。

\ s

任何空白字符;相当于[v \ f t \ n \ r \ \]

'\ w * n \ s'匹配以字母结尾的单词NG.ydF4y2Ba,后面跟着空白字符。

\ S

任何非空白空间字符;相当于[^ \ v f t \ n \ r \ \]

“\d\S”匹配后跟任何非空格字符的数字。

\ d

任何数字;相当于[0-9]

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

\ D

任何非数字字符;相当于(^ 0 - 9)

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

上的\阿\ {N}

八进制值的特征N

“\ o{40}”匹配由八进制定义的空格字符40

\xNx \ {N}

十六进制值字符N

“\x2C”匹配由十六进制定义的逗号字符2摄氏度

字符表示

操作符

描述

、一个

报警(嘟)

\ b

退格

\ f

饲料

\ n

新线

r \

回车

\ t

水平选项卡

v \

垂直制表符

\字符

任何具有特殊含义的字符,在详细信息中,您想要匹配的正则表达式(例如,使用\\匹配单个反斜杠)

量词

量词指定模式必须在匹配文本中出现的次数。

量词

表达式发生的次数

例子

expr *

连续0次或更多次。

“\w*”匹配任意长度的单词。

expr?

0乘以1乘以。

“\w*(\.m)?”匹配可选以扩展名结尾的单词00

expr +

连续1次或多次。

''匹配A.当文件名包含一个或多个字符时,标记。

expr {m, n}

至少M时间,但仅此而已NG.ydF4y2Ba连续时代。

{0,1}相当于?

'\ s {4,8}'匹配4到8个非空格字符。

expr {m,}

至少M连续时代。

{0}{1,}相当于*+分别地

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

expr{n}

确切地NG.ydF4y2Ba连续时代。

相当于{n,n}

“\ d {4}”匹配四个连续的数字。

量词可以以三种模式出现,如下表所述。Q表示上表中的任何量词。

模式

描述

例子

exprQ

贪婪表达式:匹配尽可能多的字符。

给定文本

文本”, 表达方式''匹配之间的所有字符< tr/ td>:

文本”

exprQ?

惰性表达式:匹配尽可能少的字符。

给定文本

文本”, 表达方式“”在右尖括号第一次出现时结束每个匹配(>):

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

exprQ+

占有表达:尽可能匹配,但不要重新扫描文本的任何一部分。

给定文本

文本”, 表达方式''没有返回任何匹配,因为用。*,并且不会重新扫描。

分组操作符

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

分组运营商

描述

例子

(expr)

对表达式的元素进行分组并捕获标记。

“乔? n \年代(\ w *)捕获一个令牌,该令牌包含任何有名字的人的姓氏约翰乔恩

(?:expr)

组,但不捕获令牌。

'(?:[aeiou] [^ aeiou]){2}'匹配两个元音的连续模式,然后是非瓦尔,例如“立刻”

没有分组,'[aeou] [^ aeiou] {2}'匹配元音后跟两个非暴力。

(?>expr)

原子群。不要在组内回溯以完成匹配,也不要捕获令牌。

“(? >。*)Z”不匹配“阿托兹”, 虽然'a(?:。*)z'所做的事。使用原子基团,Z被使用。*而且没有重新扫描。

(expr1 | expr2)

匹配表达式Expr1.或表达Expr2.

如果有匹配Expr1.然后Expr2.将被忽略。

您可以包括吗?? >在开括号后面,以原子方式禁止标记或分组。

“(让|电话)\ w +”匹配包含但不以电话

表达式中的锚匹配字符向量或单词的开头或结尾。

匹配……

例子

^ expr

输入文本的开头。

“^ M \ w *”匹配以开头的单词M在课文的开头。

expr $

输入文本的结束。

'\ w * m $'匹配以结尾的单词M在文本的末尾。

\

一个词的开始。

“\匹配任何以NG.ydF4y2Ba

expr \ >

一个单词的结尾。

“\ w * e \ >”匹配任何以。结尾的单词E

PookAround断言

环视断言查找紧跟在预期匹配之前或之后但不属于匹配部分的模式。

指针保持在当前位置,而对应于测验表达式不会被捕获或丢弃。因此,前向断言可以匹配重叠的字符组。

看看断言

描述

例子

expr(? =测试)

向前查找匹配的字符测验

'\ w *(?= ing)'匹配后跟的术语荷兰国际集团(ing)例如“飞”“秋天”在输入文本中“飞行,而不是坠落。”

expr(? !测试)

提前查找不匹配的字符测验

'我(?!ng)'匹配字母的实例那不是后面NG.

(? < = expr测试)

在后面查找匹配的字符测验

“(?<=re)\w*”匹配下面的术语“重新”例如'新的',“使用”, 和“周期”在输入文本中“更新、再利用、再循环”

(? < !测试)expr

在后面查找不匹配的字符测验

“(? < ! \ d) (\ d) (? ! \ d)”匹配单个数字(不跟在其他数字前面或后面的数字)。

如果指定了前向断言之前一个表达式,相当于一个逻辑运算

操作

描述

例子

(?=测试)expr

匹配两个测验expr

(? = [a - z])[^五个母音字母)”辅音相匹配。

(?!测试)expr

比赛expr不匹配测验

”(? ![五个母音字母])[a - z]”辅音相匹配。

有关更多信息,请参见正则表达式的寻道士断言

逻辑运算符和条件运算符

逻辑运算符和条件运算符允许您测试给定条件的状态,然后使用结果来确定下一个匹配的模式(如果有的话)。这些操作符支持逻辑的金宝app如果如果别的条件。(条件,请参阅PookAround断言。)

条件可以令牌,PookAround断言,或动态表情的形式(?@cmd).动态表达式必须返回逻辑或数字值。

条件运算符

描述

例子

expr1 | expr2

匹配表达式Expr1.或表达Expr2.

如果有匹配Expr1.然后Expr2.将被忽略。

“(让|电话)\ w +”匹配以开头的单词电话

(?(电导率)expr)

如果条件气孔导度真的, 然后匹配expr

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

(?(cond)expr1 | expr2)

如果条件气孔导度真的, 然后匹配Expr1..否则,匹配Expr2.

先生(年代 ?)\..*?(?( 1)她|他)\ w *’匹配包含以下内容的文本:她的当正文以夫人,或包括他的当正文以先生

令牌运营商

令牌是通过将正则表达式的一部分括在括号中定义的匹配文本的一部分。您可以通过标记在文本中的顺序(序数标记)引用标记,或者为标记分配名称,以便于代码维护和输出可读。

序数标记运算符

描述

例子

(expr)

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

“乔? n \年代(\ w *)捕获一个令牌,该令牌包含任何有名字的人的姓氏约翰乔恩

\ N

匹配N令牌。

' < (\ w +).*>.* '为HTML标记捕获令牌,例如“头衔”从文本中' <标题>一些文本< /名称>”

(?(N)expr1 | expr2)

如果是N找到令牌,然后匹配Expr1..否则,匹配Expr2.

先生(年代 ?)\..*?(?( 1)她|他)\ w *’匹配包含以下内容的文本:她的当正文以夫人,或包括他的当正文以先生

叫牌运营商

描述

例子

(? expr)

在命名标记中捕获与所包含表达式匹配的字符。

‘(? <月> \ d +) -(? <天> \ d +) -(? <年> \ d +)”在表单的输入日期,日期,日期和年份创建名为令牌的名称mm-dd-yy

\ k

匹配引用的令牌的名字

'<(?<标签> \ w +)。*>。* >'为HTML标记捕获令牌,例如“头衔”从文本中' <标题>一些文本< /名称>”

(?(名字)expr1 | expr2)

如果找到指定的令牌,则匹配Expr1..否则,匹配Expr2.

“先生(?<性别> s?)\ .. *?(?(性)她|他的)\ w *'匹配包含以下内容的文本:她的当正文以夫人,或包括他的当正文以先生

笔记

如果表达式具有嵌套括号,则MATLAB捕获对应于对应于最外侧括号组的令牌。例如,给定搜索模式”(和(y |奖赏))”, MATLAB创建令牌“安德鲁”但不是为了'是'“报答”

有关更多信息,请参见正则表达式中的令牌

动态表达式

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

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

操作符

描述

例子

(? ? expr)

解析expr并在匹配表达式中包含结果项。

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

' ^ (\ d +) ((? ? \ \ w美元{1}))”通过读取匹配开头的数字来确定要匹配多少字符。动态表达式被包含在第二组括号中,因此结果匹配被捕获到一个令牌中。例如,匹配'5xxxxx'捕捉标记为'5''xxxxx'

(? ? @cmd)

执行由以下表达式表示的MATLAB命令cmd.,并包括匹配表达式中的命令返回的输出。

”({2})。? (? ? @fliplr(1美元))”查找长度至少为4个字符的回文,例如“阿巴”

(?@cmd)

执行由以下表达式表示的MATLAB命令cmd.,但丢弃命令返回的任何输出。(有助于诊断正则表达式。)

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

在动态表达式中,使用下列操作符来定义替换项。

替换操作员

描述

$&$0

当前匹配的输入文本的部分

$`

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

$'

当前匹配后面的输入文本的一部分(使用$''代表$')

$N

N令牌

$

叫牌

$ {cmd}

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

有关更多信息,请参见动态正则表达式

评论

这个评论操作符允许您在代码中插入注释,以使其更易于维护。当与输入文本进行匹配时,注释的文本被MATLAB忽略。

字符

描述

例子

(?#评论)

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

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

搜索标志

搜索标志修改匹配表达式的行为。

国旗

描述

(? -我)

匹配字母大小写(默认为regexp.regexprep)。

(?一)

不匹配字母大小写(默认为正则表达式)。

(?s)

匹配点(),以任意字符(默认)表示。

(?-s)

将图案中的点与非换行符的任何字符匹配。

(? - m)

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

(?m)

匹配^$在行首和行尾的元字符。

(?-X)

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

x (?)

匹配时忽略空格字符和注释。使用“\”'\#'使空间与空间相匹配#字符。

标志修改的表达式可以在括号之后出现,例如

(?i)\ w *

或在括号内,并用冒号与标志分隔(:),比如

(?i:\w*)

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

另见

||||

相关的话题