我很确定我在这里遗漏了一些明显的东西,但是我不能使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
:有人可以解释一下这是怎么回事吗?
更新。 疯狂的是,在其他一些情况下,非贪婪模式的行为符合预期:
> 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
放入捕获的组中。