构建模式表达式
自从R2020b
模式是一种帮助搜索和修改文本的工具。与正则表达式类似,模式定义了匹配文本的规则。模式可以与文本搜索函数一起使用,例如包含
,匹配
,提取
指定这些函数作用于文本的哪些部分。您可以以类似于构建数学表达式的方式构建模式表达式,使用模式函数、操作符和文字文本。因为构建模式表达式是开放的,所以模式可能变得相当复杂。按步骤构建模式,并使用类似的函数maskedPattern
而且namedPattern
可以帮助组织复杂的模式。
构建简单模式
最简单的模式是从单个模式函数构建的。例如,lettersPattern
匹配任意字母。有许多模式函数用于匹配不同类型的字符和文本的其他特征。这些函数的列表可以在模式
参考页面。
txt =“abc123def”;pat = letterpattern;提取(txt,帕特)
ans =2 x1字符串“abc”“def”
模式与其他模式和文本结合使用+ (+)
操作符。该操作符将模式和文本按照它们在模式表达式中定义的顺序附加在一起。组合的模式只匹配相同顺序的文本。在本例中,“YYYY/MM/DD”不匹配,因为文本的末尾必须是四个字母的字符串。
txt =日期可以表示为MM/DD/YYYY、DD/MM/YYYY或YYYY/MM/DD;pat = letterpattern (2) +“/”+ letterpattern (2“/”+ lettersPattern (4);提取(txt,帕特)
ans =2 x1字符串“MM / DD / YYYY”“DD / MM / YYYY”
用于或(|)
运算符指定,两个指定的模式中只有一个需要匹配某段文本。如果两个模式都不能匹配,那么模式表达式就不能匹配。
txt =“123”美国广播公司;pat = letterpattern | digitpattern;提取(txt,帕特)
ans =2 x1字符串“123”“abc”
一些模式函数将模式作为输入,并以某种方式修改它们。例如,optionalPattern
如果可能,匹配指定的模式,但成功匹配并不需要该模式。
TXT = [“123”美国广播公司“abc”];pat = optionalPattern(digitpattern) + letterpattern;提取(txt,帕特)
ans =1 x2字符串“123 abc”“abc”
边界模式
边界模式是一种特殊类型的模式,它不匹配字符,而是匹配指定字符类型与其他字符或该段文本的开始或结束之间的边界。例如,digitBoundary
匹配数字字符与非数字字符之间的边界,以及数字字符与文本的开始或结束之间的边界。它不匹配数字字符本身。边界模式作为函数的分隔符非常有用,例如分裂
.
txt =“123”美国广播公司;pat = digitBoundary;帕特split (txt)
ans =3 x1字符串"" "123" "abc"
模式中的边界模式是特殊的,因为它们可以使用(~)
操作符。当以这种方式求反时,边界模式将在不满足上述要求的字符之前或之后匹配。例如,~ digitBoundary
匹配以下边界:
都是数字的字符
都是非数字的字符
非数字字符和一段文本的开始或结束
使用取代
来标记所匹配的位置~ digitBoundary
与一个“|”
的性格。
txt =“123”美国广播公司;pat = ~数字边界;替换(txt,帕特,“|”)
Ans = "1|2|3a|b|c|"
逐步构建复杂的模式
有时简单的模式不足以解决问题,需要更复杂的模式。随着模式表达式的增长,可能很难理解它匹配的是什么。简化构建复杂模式的一种方法是分别构建模式的每个部分,然后将这些部分组合成单个模式表达式。
例如,电子邮件地址使用该表单local_part@域.TLD.三个标识符(local_part、domain和TLD)中的每一个都必须是数字、字母和下划线的组合。要构建完整的模式,首先为标识符定义一个模式。构建匹配一个字母或数字字符或一个下划线字符的模式。
identCharacters = alphanumericpattern(1) | .字符“_”;
现在,使用asManyOfPattern
的一个或多个连续实例匹配identCharacters
.
identifier = asManyOfPattern(identCharacters,1);
接下来,构建一个匹配包含多个标识符的电子邮件的模式。
emailPattern =标识符+“@”+标识符+“。”+标识符;
通过查看它与以下示例电子邮件的匹配程度来测试该模式。
exampleemail = [“janedoe@mathworks.com”“abe.lincoln@whitehouse.gov”“alberteinstein@physics.university.edu”];匹配(exampleEmails emailPattern)
ans =3x1逻辑阵列1 0 0
该模式无法匹配几个示例电子邮件,尽管所有电子邮件都是有效的。local_part和domain都可以由一系列用句点分隔的标识符组成。使用标识符
模式来构建能够匹配一系列标识符的模式。asManyOfPattern
匹配尽可能多的指定模式的并发外观,但如果没有,则模式的其余部分仍然能够成功匹配。
identifierSeries = asManyOfPattern(标识符+“。”) +标识符;
使用此模式构建一个新的emailPattern
可以匹配所有示例电子邮件。
emailPattern = identifierSeries +“@”+ identifierSeries +“。”+标识符;匹配(exampleEmails emailPattern)
ans =3x1逻辑阵列1 1 1
组织模式展示
复杂的模式有时很难阅读和解释,特别是对于那些与您共享模式的人来说,他们不熟悉模式的结构。例如,当显示时,emailPattern
它又长又难读。
emailPattern
emailPattern =模式匹配:asManyOfPattern(asManyOfPattern(alphanumericpattern (1) | "_",1) + ".") + asManyOfPattern(alphanumericpattern (1) | "_",1) + "@" + asManyOfPattern(asManyOfPattern(alphanumericpattern (1) | "_",1) + ".") + asManyOfPattern(alphanumericpattern (1) | "_",1) + "."+ asManyOfPattern(alphanumericpattern (1) | "_",1)
显示的部分问题是有很多重复的标识符
模式。如果此模式的确切细节对模式的用户不重要,则显示标识符
图案可以隐藏使用maskedPattern
.此函数创建一个新模式,其中显示标识符
被屏蔽,变量名,“标识符”
,显示为。或者,您也可以指定要显示的其他名称。以这种方式隐藏的模式的详细信息可以通过单击“显示所有细节
在显示的模式中。
identifier = maskedPattern(标识符);identifierSeries = asManyOfPattern(标识符+“。”) +标识符
identifierSeries =模式匹配:asManyOfPattern(identifier + ".") + identifier显示所有详细信息
类型可以进一步组织模式namedPattern
函数。namedPattern
将模式指定为命名模式,该模式在与其他模式组合时更改模式的显示方式。电子邮件地址有几个重要部分,local_part@domain.TLD,每个都有自己的匹配规则。为每个部分创建一个命名模式。
localPart = namedPattern(identifierSeries,“local_part”);
命名模式可以嵌套,以进一步描述模式的各个部分。要嵌套命名模式,请使用命名模式构建模式,然后将该模式指定为命名模式。例如,域。TLD可分为域、子域和顶级域(TLD)。的每个部分创建命名的模式域。TLD.
subdomain = namedPattern(identifierSeries,“子域名”);domainName = namedPattern(标识符,“域名”);tld = namedPattern(标识符,“TLD”);
的组件的命名模式嵌套域在单个命名模式下域
.
domain = optionalPattern(子域+“。”) +...域名+“。”+...tld;domain = namedPattern(域);
将这些图案组合成一个单独的命名图案,emailPattern
.在展示中emailPattern
您可以看到每个命名模式和它们匹配的内容,以及任何嵌套的命名模式的信息。
emailPattern = localPart +“@”+域
emailPattern =模式使用命名模式:local_part: asManyOfPattern(identifier + ".") +标识符域:optionalPattern(subdomain + ".") + domainName + "."+ TLD子域:asManyOfPattern(identifier + ".") + identifier domainName: identifier TLD: identifier显示所有详细信息
您可以通过点索引模式来访问命名模式和嵌套命名模式。例如,您可以访问嵌套的命名模式子域名
通过点索引emailPattern
成域
然后再进行点索引子域名
.
emailPattern.domain.subdomain
ans =模式匹配:asManyOfPattern(identifier + ".") + identifier显示所有详细信息
点赋值可用于更改已命名模式,而不需要重写模式表达式的其余部分。
emailPattern。域=“mathworks.com”
emailPattern =模式使用命名模式:local_part: asManyOfPattern(identifier + ".") +标识域:"mathworks.com"显示所有详细信息