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

前端之家收集整理的这篇文章主要介绍了正则表达式 – 非贪婪字符串正则表达式匹配前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我很确定我在这里缺少一些明显的东西,但是我不能使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进入捕获的组.

猜你在找的正则表达式相关文章