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)
添加回答
举报