主要内容

正则表达式

本主题描述正则表达式是什么以及如何使用正则表达式搜索文本。正则表达式灵活而强大,尽管它们使用复杂的语法。正则表达式的替代方法是模式自从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,传递一个额外的输入,该输入是指定替换模式的表达式。

构建表达式的步骤

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

  1. 识别字符串中的唯一模式

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

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

    使用元字符和本文档中描述的操作符,将搜索模式的每个部分表示为正则表达式。然后将这些表达式段组合到搜索中使用的单个表达式中。

  3. 调用适当的搜索函数

    将想要解析的文本传递给其中一个搜索函数,例如正则表达式regexpi,或到文本替换功能,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@……
@标志
添加ISP
jan_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'}

你也可以通过输入参数使用整个单元格数组来搜索列表中每个人的电子邮件地址:

正则表达式(联系人、邮件、“匹配”);

操作符和字符

正则表达式可以包含字符、元字符、操作符、令牌和指定匹配模式的标志,如以下部分所述:

元字符

元字符表示字母、字母范围、数字和空格字符。用它们来构造一个一般的字符模式。

元字符

描述

例子

任何单个字符,包括空白

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

[c1c2c3.

方括号内的任何字符。以下字符按字面意思处理:$ |。* + ?而且-不用于表示范围时。

“(rp)是”匹配“雨”“痛苦”“.ain”

[c ^1c2c3.

任何不包含在方括号内的字符。以下字符按字面意思处理:$ |。* + ?而且-不用于表示范围时。

“[^ * rp]还”匹配所有以。结尾的四字母序列“是”,除了“雨”而且“痛苦”而且‘*是‘.例如,它匹配“获得”“躺”,或“虚空”

[c1- c2

范围内的任何字符c1通过c2

“[g]”匹配范围内的单个字符一个通过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 '匹配以字母结尾的单词ngydF4y2Ba,后面跟着一个空白字符。

\ 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次或以上。

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

expr {m, n}

至少倍,但不超过ngydF4y2Ba*连续。

{0,1}等于?

\年代{4 8}匹配4到8个非空白字符。

expr {m,}

至少*连续。

{0}而且{1,}都相当于而且+,分别。

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

expr {n}

完全ngydF4y2Ba*连续。

相当于{n, n}

“\ d{4}”匹配4位连续数字。

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

' '' '

模式

描述

例子

expr

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

给定文本' < tr > < td > < p >文本< / p > < / td >”,表达式“* > < / ? t。”匹配所有字符< tr而且/ td >

' < tr > < td > < p >文本< / p > < / td >”

expr?

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

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

'
' '

expr+

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

给定文本' < tr > < td > < p >文本< / p > < / td >”,表达式“* + > < / ? t。”不返回任何匹配,因为右尖括号捕获使用. *,不会重新扫描。

分组操作符

分组操作符允许您捕获令牌,将一个操作符应用到多个元素,或禁用特定组中的回溯。

分组操作符

描述

例子

(expr)

对表达式元素和捕获令牌进行分组。

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

(?: expr)

组,但不捕获令牌。

”(?:[五个母音字母][^五个母音字母)){2}”匹配元音后面跟着非元音的两个连续模式,例如“立刻”

没有分组,“[五个母音字母][^五个母音字母){2}”匹配一个元音后跟两个非元音。

(? > expr)

组自动。不要在组内回溯以完成匹配,也不要捕获令牌。

“(? >。*)Z”不匹配“AtoZ”,虽然“Z(?: *)。”所做的事。使用原子团,Z使用. *并且不会重新扫描。

(expr1 | expr2)

匹配表达式expr1或表达expr2

如果有匹配expr1,然后expr2将被忽略。

你可以包括吗?? >在开括号之后,以抑制标记或原子地分组。

“(让|电话)\ w +”匹配包含,但不以。结尾的单词电话

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

匹配……

例子

^ expr

输入文本的开头。

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

expr美元

输入文本结束。

“\ w * m美元”匹配以在文章的最后。

\ < expr

一个单词的开头。

“\ < n \ w *”匹配任何以开头的单词ngydF4y2Ba

expr \ >

一个词的结尾。

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

看看断言

环视断言查找紧接在预期匹配之前或之后的模式,但不是匹配的一部分。

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

看看断言

描述

例子

expr(? =测试)

提前寻找匹配的角色测验

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

expr(? !测试)

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

“我(? ! ng)”匹配字母的实例后面没有ng

(? < = expr测试)

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

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

(? < !测试)expr

寻找不匹配的字符测验

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

如果指定了超前断言之前一个表达式,其操作相当于一个逻辑

操作

描述

例子

(? =测试)expr

匹配两个测验而且expr

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

(? !测试)expr

匹配expr不匹配测验

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

有关更多信息,请参见正则表达式中的超前断言

逻辑和条件运算符

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

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

条件运算符

描述

例子

expr1 | expr2

匹配表达式expr1或表达expr2

如果有匹配expr1,然后expr2将被忽略。

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

(?(电导率)expr)

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

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

(?(电导率)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

先生(? <性>年代 ?)\..*?(?( 性)她|他)\ w *’匹配包含她的当文本开始时夫人,或包括他的当文本开始时先生

请注意

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

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

动态表情

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

包含动态表达式的括号可以创建捕获组。

操作符

描述

例子

(? ? expr)

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

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

' ^ (\ d +) ((? ? \ \ w美元{1}))”通过在匹配开始处读取数字来确定要匹配多少个字符。动态表达式包含在第二组圆括号中,以便在令牌中捕获结果匹配。例如,匹配“5 xxxxx”捕获令牌“5”而且“XXXXX”

(? ? @cmd)

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

”({2})。? (? ? @fliplr(1美元))”查找至少有四个字符长的回文,例如“神父”

(? @cmd)

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

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

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

替换操作符

描述

$ &0美元

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

美元的

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

美元的

当前匹配后的部分输入文本(使用$ "代表美元的

$ N

Nth令牌

$ <名称>

叫牌

$ {cmd}

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

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

评论

评论操作符使您能够在代码中插入注释,使其更易于维护。注释的文本在与输入文本匹配时被MATLAB忽略。

字符

描述

例子

(? #评论)

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

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

搜索的旗帜

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

国旗

描述

(? -我)

匹配字母大小写(默认为正则表达式而且regexprep).

(我)?

不匹配字母大小写(默认为regexpi).

(?)

匹配点()在模式中使用任何字符(默认)。

(? - s)

将模式中的dot与任何非换行符的字符匹配。

(? - m)

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

(?)

匹配而且行首和行尾的元字符。

(? - x)

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

x (?)

匹配时忽略空格字符和注释。使用“\”而且“\ #”为了匹配空间和字符。

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

(?我)\ w *

或者在括号内,用冒号与标志分隔开(),例如

(?我:\ w *)

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

另请参阅

||||

相关的话题