常用表达

什么是正则表达式?

正则表达式是字符序列,它定义一个特定的模式。通常使用一个正则表达式搜索文本的一组词相匹配的图案,例如,在解析程序的输入或当处理文本块。

字符向量“乔? n \ w *’是正则表达式的一个示例。它定义了以字母开头的模式中,任选地随后通过信H('H?'),然后是字母ngydF4y2Ba,并以任意数量的单词字符,即字母、数字或下划线(由'\ W *')。这种模式匹配的以下内容:

乔恩,约翰,乔纳森,约翰尼

正则表达式提供了一种独特的方法来搜索文本中的特定字符子集。而不是像处理函数那样寻找精确的字符匹配strfind,正则表达式使您能够查找特定的模式的字符。

例如,表达速度的度量率的几种方法是:

公里/小时公里/小时公里/小时公里/小时小时公里

您可以找到任何上述条款在您的文本发出五个单独的搜索命令:

strfind(文本、“公里/小时”);strfind(文本、公里/小时的);%等。

为了更有效的,但是,你可以建立一个适用于所有这些搜索词的一个短语:

把这个短语翻译成一个正则表达式(将在本节后面进行解释),你会得到:

模式=“k (ilo) ? m(一特)? (/ | \ sp \ s) h (r |我们)?”;

现在,找到只使用一个命令条款的一种或多种:

文本= [“时速250的高速列车”“汽车旁边的公里每小时”“时速120公里。”];正则表达式(文本、模式,“匹配”
ANS = 1×2单元阵列{ '公里每小时'} { '公里/小时'}

有四个MATLAB®支持使用正则表达式搜索和替换字万博1manbetx符的函数。前三个在它们接受的输入值和返回的输出值方面是相似的。有关详细信息,请单击到功能参考页面的链接。

函数 描述
正则表达式

匹配正则表达式。

regexpi

匹配正则表达式,忽略大小写。

regexprep

使用正则表达式替换部分文本。

regexptranslate

将文本转换为正则表达式。

在调用前三个函数时,传递要解析的文本和前两个输入参数中的正则表达式。当调用regexprep,传递一个附加的输入,该输入是一个表达式,该表达式指定替换的模式。

构建表达式的步骤

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

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

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

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

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

  3. 调用适当的搜索函数

    将要解析的文本传递给某个搜索函数,例如正则表达式regexpi,或文本替换函数,regexprep

本节中显示的示例搜索包含属于5个朋友组的联系信息的记录。这些信息包括每个人的姓名、电话号码、居住地和电子邮件地址。目标是从文本中提取具体信息。

联系人= {“哈利287-625-7315俄亥俄州哥伦布hparker@hmail.com”;Janice 529-882-1759弗雷斯诺,加州jan_stephens@horizon.net;“Mike 793-136-0975里士满,弗吉尼亚州sue_and_mike@hmail.net”;“纳丁648-427-9947佛罗里达州坦帕市nadine_berry@horizo​​n.net”;“Jason 697-336-7728 Montrose, CO jason_blake@mymail.com”};

的例子的第一部分中建立一个正则表达式表示一个标准的电子邮件地址的格式。使用该表达式,示例,然后搜索一群朋友之一的电子邮件地址的信息。对于卫兰联络信息是在2排联系人单元阵列:

联系人{2}
ANS = '卫529-882-1759弗雷斯诺,CA jan_stephens@horizo​​n.net'

第1步 - 识别唯一模式的文本

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

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

第2步 - 表达每个模式作为正则表达式

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

下表在最左列中显示了每个字符模式的通用格式描述。(这是从步骤1中表的右列结转过来的。)第二列显示表示字符模式的操作符或元字符。

各段描述 模式
一个或多个小写字母和下划线 (a-z_) +
@标志 @
一个或多个小写字母,无下划线 [a - z] +
点(段)字符 \。
com (COM |网)

装配这些模式为一个字符向量为您提供了完整的表达式:

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

步骤3 -调用适当的搜索函数

在此步骤中,您将使用在步骤2中派生的正则表达式来匹配组中一个朋友的电子邮件地址。使用正则表达式函数来执行搜索。

下面是本节前面显示的联系人信息列表。每个人的战绩占据的一排联系人单元阵列:

联系人= {“哈利287-625-7315俄亥俄州哥伦布hparker@hmail.com”;Janice 529-882-1759弗雷斯诺,加州jan_stephens@horizon.net;“Mike 793-136-0975里士满,弗吉尼亚州sue_and_mike@hmail.net”;“纳丁648-427-9947佛罗里达州坦帕市nadine_berry@horizo​​n.net”;“Jason 697-336-7728 Montrose, CO jason_blake@mymail.com”};

这是表示电子邮件地址的正则表达式,在步骤2中派生:

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

调用正则表达式函数的第2行联系人单元格阵列和电子邮件正则表达式。这将返回的电子邮件地址贾尼丝。

正则表达式(联系人{2},电子邮件,“匹配”
ans = 1×1单元格数组{'jan_stephens@horizon.net'}

MATLAB从左到右解析字符向量,在过程中“消耗”向量。如果找到匹配的字符,正则表达式记录的位置,并恢复解析特征向量,开始只是最近的比赛结束后。

做出同样的电话,但这次是第五人名单:

正则表达式(联系人{5},电子邮件,“匹配”
ans = 1×1单元格数组{'jason_blake@mymail.com'}

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

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

运营商和字符

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

元字符

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

元字符

描述

例子

任何单个字符,包括空格

” ..ain'匹配的连续五个字符序列一端与“是”

[c1C2C3]

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

'[RP。] AIN'匹配“雨”'痛'” .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}

八进制值的字符ñ

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

\ XNx \ {N}

十六进制值的字符ñ

'\ X2C'匹配由十六进制定义的逗号字符2摄氏度

字符表示

操作符

描述

、一个

报警(嘟)

\ b

退格

\ f

换页

\ n

新队

r \

回车

\ t

水平选项卡

v \

垂直制表符

\字符

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

量词

量词指定次数的模式必须发生在匹配的文本。

量词

匹配表达式时,它发生…

例子

expr *

0次或更多次连续。

'\ W *'匹配任意长度的单词。

expr吗?

0次或1次。

'\ W *(\。米)?'匹配可选择以扩展结尾的单词00

expr +

连续1次或多次。

' < img src = " \ w + \ . gif”>“匹配一个当文件名包含一个或多个字符时,使用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}”匹配四个连续的数字。

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

模式

描述

例子

exprq

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

鉴于文'

文本 ',该表达式“* > < / ? t。”匹配之间的所有字符< tr/ td >

'

文本 '

exprq

懒惰的表现:比赛的几个字符是必要的。

鉴于文'

文本 ',该表达式''在第一次出现结束尖括号(>):

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

exprq+

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

鉴于文'

文本 ',该表达式“* + > < / ? t。”不返回任何匹配,这是因为关角支架使用所拍摄的. *,而不是重新扫描。

分组操作符

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

分组操作符

描述

例子

(expr)

表达和捕获令牌的组的元素。

“乔? n \年代(\ w *)捕获包含姓和名的任何人员的令牌约翰乔恩

(?:表达式)

组,但不捕获令牌。

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

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

(?>表达式)

组原子。不要走回头路组内完成了比赛,并没有捕捉标记。

'A(?>。*)Z'不匹配'ATOZ',虽然“Z (?: *)。”所做的事。使用原子组,ž被使用. *并且没有重新包装。

(expr1 | expr2)

匹配表达式expr1或表达expr2

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

您可以包括?>在开括号之后,以原子方式抑制标记或组。

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

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

匹配的...

例子

^ expr

输入文本的开头。

“^ M \ w *”开始用字匹配中号在文本的开头。

expr美元

输入文本的结束。

“\ w * m美元”比赛的话结尾在课文的最后。

\ < expr

单词的开头。

'\ 匹配任何以。开头的单词ngydF4y2Ba

expr \ >

单词的结尾。

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

看看断言

Lookaround断言查找紧接在预期匹配之前或之后但不属于匹配的模式。

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

看看断言

描述

例子

expr(? =测试)

预先查找匹配的字符测试

“\ w * (? = ing)”匹配后面的术语ING, 如'飞''秋季'在输入文本中“飞,不易脱落。”

expr(? !测试)

向前查找不匹配的字符测试

“我(? ! ng)”与字母的情况下,一世没有遵循的ng

(? < = expr测试)

看看后面的字符匹配测试

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

(?<!测试)EXPR

看看后面的不匹配字符测试

“(? < ! \ d) (\ d) (? ! \ d)”匹配单个数字(不先于或跟随其他数字的数字)。

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

操作

描述

例子

(? =测试)expr

匹配两个测试expr

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

(? !测试)expr

匹配expr和不匹配测试

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

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

逻辑和条件运算符

逻辑和条件运算符允许您测试给定条件的状态,然后使用结果来确定接下来要匹配的模式(如果有的话)。这些操作符支持逻辑万博1manbetx如果如果/其他条件。(条件,请参阅看看断言)。

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

条件运算符

描述

例子

表达式1 |表达式2

匹配表达式expr1或表达expr2

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

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

(?(条件)表达式)

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

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

(?(电导率)expr1 | expr2)

如果条件气孔导度真正的,然后匹配expr1。否则,匹配expr2

“先生(s ?) \ . . * ?(?(1)她|他)\ w *’匹配的文本,其中包括她的当正文以夫人,或包括他的当正文以先生

令牌运营商

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

序令牌操作

描述

例子

(expr)

捕获在令牌匹配封闭表达式的所有字符。

“乔? n \年代(\ w *)捕获包含姓和名的任何人员的令牌约翰乔恩

\ N

匹配ñ令牌。

“< (\ w +)。* >。* < / \ 1 > '捕获HTML标记的标记,例如'标题'从文本中' <标题>一些文本”< /名称>

((N)表达式1 |?表达式2)

如果ñ找到该令牌,然后匹配expr1。否则,匹配expr2

“先生(s ?) \ . . * ?(?(1)她|他)\ w *’匹配的文本,其中包括她的当正文以夫人,或包括他的当正文以先生

叫牌运营商

描述

例子

(?<名称>表达式)

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

'(<月> \ d +) - (<天> \ d +) - (?<年> \ d +)'在表单的输入日期中为月、日和年创建命名令牌mm-dd-yy

\ k <名称>

匹配by引用的令牌的名字

' <(? <标记> \ w +)。* >。* < / \ k <标记> >”捕获HTML标记的标记,例如'标题'从文本中' <标题>一些文本”< /名称>

(?(名字)expr1 | expr2)

如果发现指定的标记,然后匹配expr1。否则,匹配expr2

“先生(<性> s ?) \ . . * ?(?(性)她|他)\ w *’匹配的文本,其中包括她的当正文以夫人,或包括他的当正文以先生

注意

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

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

动态表达式

动态表情让你执行MATLAB命令或正则表达式来确定文本相匹配。

将动态表达式括起来的括号可以做到这一点创建捕获组。

操作符

描述

例子

(? ? expr)

解析expr和包括在匹配表达的所得术语。

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

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

(? ? @cmd)

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

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

(?@cmd)

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

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

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

更换运营商

描述

$&$ 0

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

$`

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

$”

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

$ N

ñth令牌

$ <名称>

叫牌

$ {cmd}

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

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

评论

评论运算符使您可以在代码中插入注释,从而使代码更易于维护。MATLAB在与输入文本进行匹配时忽略注释的文本。

字符

描述

例子

(?#评论)

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

'(?#初始数字)\ <\ d \ W +'包含注释,并匹配以数字开头的单词。

搜索的旗帜

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

国旗

描述

(? -我)

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

(?一世)

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

(?)

匹配点()与任何字符(默认)模式。

(?-s)

在这不是一个换行符的任何字符模式匹配点。

(? - m)

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

(M +)

匹配^$在一行的开始和结束的元字符。

(? - x)

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

x (?)

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

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

(?我)\ w *

或括号内和从标志分离用冒号(),比如

(I:\ W *)

后者的语法允许你去改变一个更大的表达式的一部分。

也可以看看

|||

相关的话题