文档

正则表达式中的前向断言

断言

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

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

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

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

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

重叠的匹配

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

例如,使用前瞻性来查找每一个字符向量中六个非空白字符的序列,通过匹配位于五个附加字符前面的初始字符:

空空的=找到几个6-char。短语“;startIndex = regexpi(chr,(? = \ \年代{5})”
startIndex = 1 8 9 16 17 24 25

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

定位每一个6字符。短语hrases

在没有向前看运算符的情况下,MATLAB从左到右解析字符向量,并在向量前进的过程中使用该向量。如果找到匹配的字符,正则表达式记录位置并从最近匹配的位置恢复对字符向量的解析。在这个过程中没有人物重叠。

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

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

定位六个字符的短语

逻辑与条件

使用前向操作的另一种方法是执行逻辑操作在两个条件之间。类的帮助的前50个字符组成的字符数组中,此示例最初试图定位所有小写辅音规范功能:

Helptext = help(“规范”);CHR = helptext(1:50)
chr = ' NORMEST估计矩阵2范数。规范(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

另请参阅

||

相关的话题