gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 13:01:58 26 4
gpt4 key购买 nike

我正在改进 this回答;并发现下面给出的正则表达式在 R 中无法正常工作(根据其含义) .

 +?on.*$

根据我对正则表达式的理解,上述正则表达式匹配:

lazily space one or more times followed by on followed by anything(except newline) till the end.



输入:
Posted by ondrej on 29 Feb 2020.
Posted by ona'je on 29 Feb 2020.

输出(根据我的说法,如果测试字符串中的上述正则表达式模式被替换为“”)
Posted by
Posted by

当我试图在 python (implementation here) 中测试它时, javascript java (implementation here) ;我得到了预期的结果。

const myString = "Posted by ondrej on 29 Feb 2020.\nPosted by ona'je on";

console.log(myString.replace( new RegExp(" +?on.*$","gm"),""));


另一方面,如果我尝试在 R (implementation here) 中实现相同的正则表达式;我得到的结果是
Posted by ondrej
Posted by ona'je

这是出乎意料的。

怀疑

我认为可能是 R 的正则表达式解析器工作方式不同(可能从右到左)。我在 R 中阅读了关于正则表达式如何工作的文档但发现上述正则表达式与其他语言没有什么不同。我可能在这里遗漏了一些东西。我不精通 R但就我的正则表达式知识而言;我相信上面的正则表达式应该可以在 java 中使用。 , javascriptpython (也可能在 pcre 中。)对于每个标准正则表达式引擎(据我所知)。我的问题是 为什么上述正则表达式在 R 中的工作方式不同?

最佳答案

看起来像 TRE regex engine (在基本 R 正则表达式函数中默认使用),基于最初由 Henry Spencer 在 1986 年编写的正则表达式库,如果正则表达式中的第一个模式以惰性量词开头并以$ anchor 。

比较 these cases :

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

到底是怎么回事?
  • 第一种情况是sub(" +?on.*$", "", Data)第一个模式将所有量词的贪婪设置在正则表达式的同一级别。所以,第二个量词 * , 即使没有 ? 也会被设置为惰性在它之后作为第一个空格被量化为 +? ,一个惰性量词。这是一个已知的 TRE“错误”,也存在于其他一些基于 Henry Spencer 的 regexl 库的正则表达式引擎中。
  • 第二个sub(" +?on.*", "", Data)匹配方式与写入 " +?on.*?" 相同(同样,由于第一个模式将贪婪级别设置为懒惰)和 would only match 1 个或多个空格,然后是 on , .*?在模式结束时不匹配。
  • 第三个,sub(" +?on(.*)", "", Data) ,产生预期结果,因为第二个量化模式 .* , 位于另一层(深一层),它的贪心度不受 +? 的影响。那是在另一个层面上。所以,(.*)在这里贪婪地匹配。
  • 第四个,sub(" +on.*", "", Data) ,产生预期结果,因为第一个模式是贪婪的,所以下一个量化的模式贪婪也是贪婪的。
  • 关于javascript - 对于给定的正则表达式,R 正则表达式编译器的工作方式不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62019141/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com