R - 为啥 str_detect 在以破折号结尾的“单词”上使用单词边界时返回与 grepl 不同的结果

Posted

技术标签:

【中文标题】R - 为啥 str_detect 在以破折号结尾的“单词”上使用单词边界时返回与 grepl 不同的结果【英文标题】:R - why does str_detect return a different result than grepl when using word boundary on 'words' ending with dashR - 为什么 str_detect 在以破折号结尾的“单词”上使用单词边界时返回与 grepl 不同的结果 【发布时间】:2019-08-25 20:07:54 【问题描述】:

str_detect 的帮助页面声明“等效于 grepl(pattern, x)”,但是:

str_detect("ALL-", str_c("\\b", "ALL-", "\\b"))
[1] FALSE

虽然

grepl(str_c("\\b", "ALL-", "\\b"), "ALL-")
[1] TRUE

我想其中一个没有按预期工作?还是我错过了什么?

【问题讨论】:

不确定是否是单词边界,因为str_detect("ALL-", str_c("\\b", "ALL", "\\b")) 返回TRUE 【参考方案1】:

当您将参数perl = TRUE 添加到grepl() 时,它会给出相同的结果:

> grepl(str_c("\\b", "ALL-", "\\b"), "ALL-")
[1] TRUE
> grepl(str_c("\\b", "ALL-", "\\b"), "ALL-", perl = T)
[1] FALSE

这个参数意味着grepl() 将使用 Perl Compatible Regex。

?grep中有这个警告,可能有关系?

gsub 和 gregexpr 的 POSIX 1003.2 模式无法正确处理重复的单词边界(例如,pattern = "\b")。对此类匹配项使用 perl = TRUE(但对于非 ASCII 输入,这可能无法按预期工作,因为“单词”的含义取决于系统)。

【讨论】:

以上是关于R - 为啥 str_detect 在以破折号结尾的“单词”上使用单词边界时返回与 grepl 不同的结果的主要内容,如果未能解决你的问题,请参考以下文章

PHPUnit:如何仅在以 Test 结尾的类中运行测试?

电子邮件的正则表达式用户名应以 [a-zA-Z0-9] 开头或结尾,但可能包含破折号、下划线

如何在以特定单词开头并以另一个单词结尾的字符串中出现多次[重复]

Xcode 11 beta 无法在以证书问题结尾的设备上安装应用程序

为啥 .NET GUID 中有破折号?

为啥 CSS 选择器/HTML 属性首选破折号?