非贪婪字符串正则表达式匹配

我很确定我在这里遗漏了一些明显的东西,但我不能让R使用非贪婪正则表达式:

>图书馆(stringr)
&燃气轮机;str_匹配('xxx aaaab yyy',“a.*b”)
[,1]   
[1,]“aaaab”

基本函数的行为方式相同:

>regexpr('a.*b','xxx aaaab yyy')
[1] 5
属性(,“匹配长度”)
[1] 5
属性(,“useBytes”)
[1] 真的

根据中的“贪婪”注释,我希望匹配仅为abhttp://stat.ethz.ch/R-manual/R-devel/library/base/html/regex.html:

默认情况下,重复是贪婪的,因此使用最大可能的重复次数。
可以通过添加“最小值”将其更改为“最小值”?对于量词。(还有更多
允许近似匹配的量词:请参阅TRE文档。)

有人能解释一下发生了什么事吗

更新。疯狂的是,在其他一些情况下,非贪婪模式的行为与预期一致:

>str_match('xxx<a href='https://stackoverflow.com/questions/16577432/abc“>链接</a>yyy<h1>标题</h1>',“<a.*>”)
[,1]                                          
[1,]“<a href=\'abc\'>链接</a>yyy<h1>标题</h1>”
&燃气轮机;str_match('xxx<a href='https://stackoverflow.com/questions/16577432/abc“>链接</a>yyy<h1>标题</h1>',“<a.*?>”)
[,1]              
[1,]“<a href=\“abc\”>”

困难的概念,所以我会尽我最大的努力。。。如果有点混乱,有人可以随意编辑和解释

从左到右搜索与模式匹配的表达式。是的,以下所有字符串aaaabaaabaabab都与您的模式匹配,但是aaaaaab最左边开始的字符串是返回的字符串

所以在这里,您的非贪婪模式不是很有用。也许这另一个例子可以帮助您更好地理解非贪婪模式的作用:

str_匹配('xxx aaaab yyy',“a.*y”)
#      [,1]     
#[1,]“aaaab y”

这里所有的字符串aaaab yaaaab yyaaaab yy都与模式匹配并从相同的位置开始,但由于非贪婪模式,返回了第一个字符串


那么,你能做些什么来捕捉最后的ab?使用以下命令:

str_匹配('xxx aaaab yyy',“*(a.*b)”)
#      [,1]        [,2]
#[1,]“xxx aaaab”“ab”

它是如何工作的?通过在前面添加贪婪模式*,您现在正在强制进程将最后一个可能的a放入捕获的组中

发表评论