检测与 str_detect() 的完全匹配,涉及 R 中的空格和标点符号

Detecting exact matches with str_detect() that involves whitespace and punctuation in R

无法为我提供明确的解决方案。

假设我有

test <- c("HR", "p-value (stratified)", "HRf", "HR-fake", "p-value", "p-value (unstratified)")
want <- c(TRUE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE)

最好的方法就是简单地

> test == "HR" | test == "p-value (stratified)"
[1]  TRUE  TRUE FALSE FALSE FALSE FALSE

但为了学习,我想用正则表达式来做。但是,其中 none 对我有用。

> str_detect(testvec, "HR|p-value (stratified)")
[1]  TRUE FALSE  TRUE  TRUE FALSE FALSE
> str_detect(testvec, "\bHR\b|\bp-value (stratified)\b")
[1]  TRUE FALSE FALSE  TRUE FALSE FALSE

看来问题是 str_detect() 是

  1. 即使使用“\bHR\b”

    也能检测到“HR-fake”

    str_detect("HRf","\bHR\b") FALSE

    str_detect("HR-fake","\bHR\b") TRUE

    str_detect("HR - fake","\bHR\b") TRUE

  2. 即使使用“p 值(分层)”也未检测到“p 值(分层)”

    str_detect("p-value (stratified)","p-value (stratified)") FALSE

是什么导致了这里的问题?谢谢。

除了注释之外,我们还需要指定开始(^)和结束($)否则它可以匹配HR-fake虽然我们可以阻止匹配HRf 字边界 (\b)

 str_detect(test, regex("^(HR|p-value \(stratified\))$"))
[1]  TRUE  TRUE FALSE FALSE FALSE FALSE