我正在努力完善this答案;并发现下面给出的正则表达式在R
中工作不正常(根据其含义)
+?on.*$
根据我对regex的理解,上述regex符合:
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
的正则表达式解析器可能工作方式不同(可能从右到左)。我阅读了关于regex如何在R
中工作的文档,但发现上述regex与其他语言没有什么不同。我可能遗漏了什么。我并不精通R
,但就我的正则表达式知识而言;我相信上面的正则表达式应该像它在{R
中的工作方式不同?
它看起来像TRE regex engine(在基R正则表达式函数中默认使用),基于最初由Henry Spencer在1986年编写的正则表达式库,如果正则表达式中的第一个模式以惰性量词开始,以
$
锚点结束,则匹配字符串末尾的最短匹配比较these cases:
发生了什么事
第一种情况是
sub(" +?on.*$", "", Data)
,第一种模式设置正则表达式中同一级别上所有量词的贪婪性。因此,第二个量词*
,将被设置为lazy,即使在没有?
的情况下也是如此,因为第一个空间是用+?
一个懒惰量词来量化的。这是一个已知的TRE“bug”,也存在于基于Henry Spencer的regexl库的一些其他regex引擎中第二个
sub(" +?on.*", "", Data)
匹配的方式与写入" +?on.*?"
的方式相同(同样,由于第一个模式将贪婪级别设置为该级别上的懒惰),并且would only match1个或多个空格,然后on
,.*?
在模式结束时不匹配任何内容第三个模式
sub(" +?on(.*)", "", Data)
产生了预期的结果,因为第二个量化模式.*
位于另一个层次(一个层次深),其贪婪性不受另一个层次上的+?
的影响。所以,(.*)
在这里非常匹配第四个模式
sub(" +on.*", "", Data)
产生了预期的结果,因为第一个模式是贪婪的,所以下一个量化的模式贪婪也是贪婪的相关问题 更多 >
编程相关推荐