我很确定我在这里缺少一些明显的东西,但是我不能使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进入捕获的组.