正则表达式中的前向断言
断言
正则表达式有两种类型的查找断言:向前查找和向后查找。在这两种情况下,断言都是必须满足的条件,以返回与表达式的匹配。
一个超前断言具有以下形式(? =测试)
和可以出现在正则表达式中的任何位置。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