为了账号安全,请及时绑定邮箱和手机立即绑定

R 正则表达式编译器对给定正则表达式的工作方式不同

R 正则表达式编译器对给定正则表达式的工作方式不同

慕码人8056858 2022-09-02 10:54:13
我正在努力完善这个答案;并发现下面给出的正则表达式在 中无法正常工作(根据其含义)。R +?on.*$根据我对正则表达式的理解,上述正则表达式匹配:懒洋洋地间隔一次或多次,然后是 on,然后是任何内容(换行符除外),直到最后。输入:Posted by ondrej on 29 Feb 2020.Posted by ona'je on 29 Feb 2020.OUTPUT(据我所知,如果测试字符串中的正则表达式模式被替换为“”)Posted byPosted by 当我试图在python(这里的实现)中测试它时,javascript和java(这里的实现);我得到了我预期的结果。const myString = "Posted by ondrej on 29 Feb 2020.\nPosted by ona'je on";console.log(myString.replace( new RegExp(" +?on.*$","gm"),""));展开代码段另一方面,如果我试图在R中实现相同的正则表达式(在这里实现);或者我得到的结果是Posted by ondrejPosted by ona'je这是出乎意料的。怀疑我认为也许正则表达式解析器的工作方式不同(也许是从右到左)。我阅读了正则表达式如何工作的文档,但发现上述正则表达式与其他语言没有什么不同。我在这里可能错过了一些东西。我不精通,但就我的正则表达式知识而言;我相信上面的正则表达式应该像它的工作方式一样工作,并且(也可能在)每个标准正则表达式引擎中(据我所知)。我的问题是为什么上面的正则表达式在R中的工作方式不同?RRRjavajavascriptpythonpcre
查看完整描述

1 回答

?
婷婷同学_

TA贡献1844条经验 获得超8个赞

看起来 TRE 正则表达式引擎(默认情况下在基本 R 正则表达式函数中使用)基于 Henry Spencer 最初由 Henry Spencer 在 1986 年编写的正则表达式库,如果正则表达式中的第一个模式以惰性量词开头并以 anchor 结尾,则与字符串末尾的最短匹配匹配匹配。$


比较以下情况:


sub(" +?on.*$", "", Data)  # "Posted by ondrej" "Posted by ona'je"

sub(" +?on.*", "", Data)   # "Posted bydrej on 29 Feb 2020." "Posted bya'je on 29feb 2020"

sub(" +?on(.*)", "", Data) # as expected

sub(" +on.*", "", Data)    # as expected

这是怎么回事?

  • 第一种情况是,第一种模式将所有量词的贪婪性设置为正则表达式中的同一水平。因此,第二个量词 , 将被设置为懒惰,即使没有之后,因为第一个空间被量化为 ,一个懒惰量词。这是一个已知的TRE“错误”,也存在于基于Henry Spencer的regexl库的其他一些正则表达式引擎中。sub(" +?on.*$", "", Data)*?+?

  • 第二个匹配的方式与编写方式相同(同样,由于第一个模式在该级别上将贪婪级别设置为懒惰),并且该模式仅匹配1个或多个空格,然后在模式结束时不匹配任何内容。sub(" +?on.*", "", Data)" +?on.*?"on.*?

  • 第三个,产生预期的结果,因为第二个量化模式,在另一个层次(一个层次深)上,它的贪婪不受另一个层次的影响。所以,在这里贪婪地匹配。sub(" +?on(.*)", "", Data).* +?(.*)

  • 第四个,产生预期的结果,因为第一个模式是贪婪的,所以下一个量化的模式贪婪也是贪婪的。sub(" +on.*", "", Data)


查看完整回答
反对 回复 2022-09-02
  • 1 回答
  • 0 关注
  • 108 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信