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 不同的结果的主要内容,如果未能解决你的问题,请参考以下文章
电子邮件的正则表达式用户名应以 [a-zA-Z0-9] 开头或结尾,但可能包含破折号、下划线
如何在以特定单词开头并以另一个单词结尾的字符串中出现多次[重复]