主要内容

正则表达式中的超前断言

断言

正则表达式有两种类型的四处查找断言:前向查找和后向查找。在这两种情况下,断言都是返回与表达式匹配的必须满足的条件。

一个超前断言的形式是(? =测试)并且可以出现在正则表达式中的任何位置。MATLAB®在文本中当前位置的前面查找测试条件。如果MATLAB匹配测试条件,它将继续处理表达式的其余部分以找到匹配。

例如,在指定路径的字符向量中向前查找包含程序文件的文件夹的名称(在本例中,fileread.m).

CHR = which(“fileread”
CHR = 'matlabrootmatlab工具箱\ \ \ iofun \ fileread.m”
正则表达式(空空的,' \ w + (? = \ \ \ w + \ (mp))”“匹配”
Ans = 1×1单元格数组{'iofun'}

匹配表达式,\ w +,搜索一个或多个字母数字或下划线字符。每一次正则表达式找到一个与此条件匹配的项,它会查找一个反斜杠(由两个反斜杠指定,\ \),后面跟着一个文件名(\ w +)与00每分钟扩展(\ [mp]。).的正则表达式函数返回满足超前条件(即文件夹名称)的匹配项iofun

重叠的匹配

超前断言不消耗文本中的任何字符。因此,您可以使用它们来查找重叠的字符序列。

例如,使用超前查找每一个字符向量中六个非空白字符的序列,通过匹配五个额外字符前面的初始字符:

空空的=找到几个6字符。短语“;startIndex = regexpi(chr,(? = \ \年代{5})”
startIndex = 1 8 9 16 17 24 25 .使用实例

起始索引对应于以下短语:

找到每一个6-char。短语hrases

如果没有前瞻操作符,MATLAB将从左到右解析字符向量,并在向量移动时使用该向量。如果找到匹配的字符,正则表达式记录位置并从最近匹配的位置继续解析字符向量。在这个过程中没有人物的重叠。

空空的=找到几个6字符。短语“;startIndex = regexpi(chr,\年代{6}
startIndex = 1 8 16 24

起始索引对应于以下短语:

找到每一个6字符短语

逻辑与条件

使用超前操作的另一种方法是执行逻辑操作在两个条件之间。属性的帮助的前50个字符组成的字符数组中定位所有小写辅音规范功能:

Helptext = help(“规范”);CHR = helptext(1:50)
chr = ' NORMEST估计矩阵2-norm。规范(S '

只搜寻非元音字母([^五个母音字母))不会返回预期的答案,因为输出包括大写字母、空格字符和标点符号:

C = regexp(chr,“[^五个母音字母]“匹配”
43 c = 1×1到14单元阵列列{‘}{' N '} {' O '}{‘R’}{“M”}{“E”}{' S '} {T '} {' '} {' E”}{s} {' t '}{“m”}{' t '}列15到28日{‘}{' t '}{“h '} {' '} {' m '} {' t '}{‘r’}{' x '} {' '} {' 2 '} {'-'} {' n '}{‘r’}{“m”}列29日通过42{”。'}{↵ '} {' '} {' '} {' '} {' '} {' N '}{“O”}{‘R’}{“M”}{“E”}{S} {' T '}{”(“}列43{“S”}

再次尝试,使用前瞻操作符创建以下内容条件:

(小写字母)AND(不是元音)

这一次,结果是正确的:

C = regexp(chr,(? = [a - z])[^五个母音字母)”“匹配”
c = 1×13单元阵列{s} {' t '}{“m”}{' t '} {' t '} {' h '}{“m”}{' t '}{‘r’}{x} {' n '}{‘r’}{' m '}

注意,在使用前视操作符执行,则需要放置匹配表达式expr测试表达式测验

(?=test)expr或(?!test)expr

另请参阅

||

相关的话题