加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Linux > 正文

R vs sed正则表达式贪婪

发布时间:2020-12-14 00:29:39 所属栏目:Linux 来源:网络整理
导读:我不太明白为什么这不会导致“测试”并且会理解一个解释: a = "blah test"sub('^.*(test|$)','1',a)# [1] "" 将它与sed表达式进行比较: echo 'blah test' | sed -r 's/^.*(test|$)/1/'# testecho 'blah blah' | sed -r 's/^.*(test|$)/1/'# Fwiw,以下
我不太明白为什么这不会导致“测试”并且会理解一个解释:

a = "blah test"
sub('^.*(test|$)','1',a)
# [1] ""

将它与sed表达式进行比较:

echo 'blah test' | sed -r 's/^.*(test|$)/1/'
# test
echo 'blah blah' | sed -r 's/^.*(test|$)/1/'
#

Fwiw,以下实现了我想要的R(并且相当于上面的sed结果):

sub('^.*(test)|^.*',a)

解决方法

正则表达式引擎的开头匹配字符串末尾的所有字符,即贪婪.*,然后它尝试匹配(test | $),即字符串文字’test’或字符串的结尾.由于.*的第一个贪婪匹配匹配所有字符,它反向引用一个字符,然后再次尝试匹配(test | $),这里$匹配字符串的结尾.

使您的匹配结果成为行尾字符

我认为sed使用POSIX NFA试图在Alternation中找到最长的匹配,这与R不同,R似乎使用了传统的NFA

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读