首页 > 解决方案 > R - 为什么 str_detect 在以破折号结尾的“单词”上使用单词边界时返回与 grepl 不同的结果

问题描述

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

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

尽管

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

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

标签: rregexstr-replacestringr

解决方案


当您将参数添加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 模式不能与重复的字边界(例如,模式 = "\b")一起正常工作。使用 perl = TRUE 进行此类匹配(但对于非 ASCII 输入可能无法按预期工作,因为“单词”的含义取决于系统)。


推荐阅读