我很确定我在这里缺少一些明显的东西,但是我不能使R使用非贪心的正则表达式:
> library(stringr) > str_match('xxx aaaab yyy',"a.*?b") [,1] [1,] "aaaab"
基本功能的行为方式相同:
> regexpr('a.*?b','xxx aaaab yyy') [1] 5 attr(,"match.length") [1] 5 attr(,"useBytes") [1] TRUE
我希望比赛根据http://stat.ethz.ch/R-manual/R-devel/library/base/html/regex.html中的“贪婪”评论只是ab:
By default repetition is greedy,so the maximal possible number of repeats is used.
This can be changed to ‘minimal’ by appending ? to the quantifier. (There are further
quantifiers that allow approximate matching: see the TRE documentation.)
有人可以解释一下我发生了什么吗?
更新.疯狂的是,在其他一些情况下,非贪婪模式的行为与预期的一样:
> str_match('xxx <a href="abc">link</a> yyy <h1>Header</h1>','<a.*>') [,1] [1,] "<a href=\"abc\">link</a> yyy <h1>Header</h1>" > str_match('xxx <a href="abc">link</a> yyy <h1>Header</h1>','<a.*?>') [,1] [1,] "<a href=\"abc\">"
困难的概念,所以我会尽我所能…有人有空闲的编辑和解释更好,如果有点混乱.
与您的模式匹配的表达式从左到右进行搜索.是的,所有以下字符串aaaab,aaab,aab和ab都与您的模式匹配,但是aaaab是从左侧开始最多的字符串是返回的字符串.
所以这里,你的非贪心的模式不是很有用.也许这个其他的例子可以帮助你更好地了解一个非贪心的模式:
str_match('xxx aaaab yyy',"a.*?y") # [,1] # [1,] "aaaab y"
这里所有的字符串aaaab y,aaaab yy,aaaab yyy匹配模式,并在同一位置开始,但第一个由于非贪心模式而返回.
那么你能做什么来抓住最后一个ab?用这个:
str_match('xxx aaaab yyy',".*(a.*b)") # [,1] [,2] # [1,] "xxx aaaab" "ab"
它是如何工作的?通过添加一个贪心的模式*在前面,你现在迫使进程把最后一个可能的a进入捕获的组.