主要内容

构建模式表达式

自从R2020b

模式是一种帮助搜索和修改文本的工具。与正则表达式类似,模式定义了匹配文本的规则。模式可以与文本搜索函数一起使用,比如包含匹配,提取指定这些函数作用于文本的哪些部分。可以使用模式函数、操作符和文本,以与构建数学表达式类似的方式构建模式表达式。由于构建模式表达式是开放的,因此模式可能变得相当复杂。按步骤构建模式并使用类似的函数maskedPattern而且namedPattern可以帮助组织复杂的模式。

构建简单的模式

最简单的模式是从单个模式函数构建的。例如,lettersPattern匹配任何字母字符。有许多模式函数用于匹配不同类型的字符和文本的其他特征。这些函数的列表可以在模式参考页面。

txt =“abc123def”;帕特= lettersPattern;提取(txt,帕特)
ans =2 x1字符串“abc”“def”

模式与其他模式和文本结合使用+ (+)操作符。该操作符按照模式表达式中定义的顺序将模式和文本追加在一起。组合的模式只匹配相同顺序的文本。在本例中,“YYYY/MM/DD”不匹配,因为文本的末尾必须有一个由四个字母组成的字符串。

txt =日期可以表示为日/日/年,日/月/年,或年/月/日;pat = letterpattern (2) +“/”+ lettersPattern (2) +“/”+ lettersPattern (4);提取(txt,帕特)
ans =2 x1字符串“MM / DD / YYYY”“DD / MM / YYYY”

使用的模式或(|)操作符指定两个指定模式中只需要一个匹配文本部分。如果两个模式都不能匹配,则模式表达式将无法匹配。

txt =“123”美国广播公司;帕特= lettersPattern | digitsPattern;提取(txt,帕特)
ans =2 x1字符串“123”“abc”

一些模式函数将模式作为输入,并以某种方式修改它们。例如,optionalPattern如果可能,使指定的模式匹配,但成功匹配不需要该模式。

txt = [“123”美国广播公司“abc”];pat = optionalPattern(digitpattern) + letterpattern;提取(txt,帕特)
ans =1 x2字符串“123 abc”“abc”

边界模式

边界模式是一种特殊类型的模式,它不匹配字符,而是匹配指定字符类型与其他字符或该段文本的开始或结束之间的边界。例如,digitBoundary匹配数字字符与非数字字符之间以及数字字符与文本开头或结尾之间的边界。它不匹配数字字符本身。边界模式作为分隔符对于诸如分裂

txt =“123”美国广播公司;帕特= digitBoundary;帕特split (txt)
ans =3 x1字符串“123”“abc”

边界模式在模式中是特殊的,因为它们可以使用(~)操作符。当以这种方式进行否定时,边界模式将在不满足上述要求的字符之前或之后进行匹配。例如,~ digitBoundary匹配以下边界:

  • 都是数字的字符

  • 都是非数字的字符

  • 一段文本的开头或结尾的非数字字符

使用取代标记匹配的位置~ digitBoundary与一个“|”的性格。

txt =“123”美国广播公司;帕特= ~ digitBoundary;替换(txt,帕特,“|”
ans = " 1 | 2 | 3 | b c | |”

按步骤构建复杂的模式

有时一个简单的模式不足以解决问题,需要一个更复杂的模式。随着模式表达式的增长,可能会很难理解它匹配的是什么。简化构建复杂模式的一种方法是分别构建模式的每个部分,然后将这些部分组合成单个模式表达式。

例如,电子邮件地址使用该表单local_part@TLD.三个标识符——local_part、domain和TLD——都必须是数字、字母和下划线字符的组合。要构建完整的模式,首先为标识符定义一个模式。构建匹配一个字母或数字字符或一个下划线字符的模式。

identCharacters = alphanumericpattern (1) |“_”

现在,使用asManyOfPattern的一个或多个连续实例的匹配identCharacters

标识符= asManyOfPattern (identCharacters, 1);

接下来,构建一个匹配包含多个标识符的电子邮件的模式。

emailPattern = identifier +“@”+标识符+“。”+标识符;

测试该模式,看看它与以下示例电子邮件的匹配程度如何。

exampleEmails = [“janedoe@mathworks.com”“abe.lincoln@whitehouse.gov”“alberteinstein@physics.university.edu”];匹配(exampleEmails emailPattern)
ans =3 x1逻辑阵列1 0 0

尽管所有的电子邮件都是有效的,但该模式未能匹配几个示例电子邮件。local_part和domain都可以由一系列用句点分隔的标识符组成。使用标识符模式来构建能够匹配一系列标识符的模式。asManyOfPattern匹配指定模式尽可能多的并发出现,但如果没有,则模式的其余部分仍然能够成功匹配。

identifierSeries = asManyOfPattern(identifier +“。”) +标识符;

使用此模式构建新的emailPattern可以匹配所有示例电子邮件。

emailPattern = identifierSeries +“@”+ identifierSeries +“。”+标识符;匹配(exampleEmails emailPattern)
ans =3 x1逻辑阵列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.此函数创建一个新模式,其中显示标识符被屏蔽,变量名,“标识符”,则显示。或者,您可以指定要显示的不同名称。以这种方式隐藏的模式的详细信息可以通过点击“显示所有的细节在显示的图案中。

标识符= maskedPattern(标识符);identifierSeries = asManyOfPattern(identifier +“。”) +标识符
identifierSeries =模式匹配:asManyOfPattern(identifier + ".") + identifier显示所有详细信息

模式可以使用namedPattern函数。namedPattern将模式指定为命名模式,以更改模式与其他模式结合时的显示方式。电子邮件地址有几个重要部分,local_part@domain.TLD,每个都有自己的匹配规则。为每个部分创建一个命名模式。

localPart = namedPattern (identifierSeries,“local_part”);

命名模式可以嵌套,以进一步描述模式的各个部分。要嵌套命名模式,请使用命名模式构建模式,然后将该模式指定为命名模式。例如,域。TLD可分为域、子域和顶级域(TLD)。的每个部分创建命名模式域。TLD

子域名= namedPattern (identifierSeries,“子域名”);域名= namedPattern(标识符,“域名”);tld = namedPattern(标识符,“TLD”);

的组件的命名模式嵌套在一个命名的模式下

domain = optionalPattern(子域+“。”) +...域名+“。”+...tld;域= namedPattern(域);

将这些模式组合成一个单独的命名模式,emailPattern.在展示emailPattern您可以看到每个命名模式和它们匹配的内容,以及任何嵌套命名模式的信息。

emailPattern = localPart +“@”+域
emailPattern =模式使用命名模式:local_part: asManyOfPattern(identifier + ".") +标识符域:optionalPattern(子域+ ".")+ domainName + "."+ TLD子域:asManyOfPattern(identifier + ".") + identifier domainName: identifier TLD: identifier显示所有详细信息

您可以通过对模式的点索引来访问命名模式和嵌套命名模式。例如,您可以访问嵌套的命名模式子域名通过dot-indexingemailPattern然后再点索引成子域名

emailPattern.domain.subdomain
ans =模式匹配:asManyOfPattern(identifier + ".") + identifier显示所有详细信息

点赋值可用于更改已命名模式,而不需要重写模式表达式的其余部分。

emailPattern。域=“mathworks.com”
emailPattern =模式使用命名模式:local_part: asManyOfPattern(标识符+ ".")+标识符域:"mathworks.com"显示所有详细信息

另请参阅

|||||

相关的话题