如何使用str_detect匹配包含括号的字符串?
问题原因
括号()是正则表达式中的特殊元字符,用于定义捕获组。你的代码直接拼接字符串生成正则模式时,"Google (1992)"会被正则引擎解析为"Google "加上一个捕获组(1992),而非字面意义的括号,因此无法匹配原字符串。
解决方案
有两种简单的修复方式:
方式一:使用固定文本匹配
用fixed()函数告诉str_detect把整个匹配模式当作固定文本,忽略正则元字符的特殊含义:
a <- c("Apple", "Facebook", "Google (1992)") b <- c(1, 2, 3) c <- data.frame(a, b) d <- c %>% distinct(a) %>% pull() c %>% filter(str_detect(a, fixed(paste(d, collapse = "|")))) %>% group_by(a) %>% tally()
方式二:转义正则特殊字符
用stringr::str_escape()逐个转义每个字符串中的正则特殊字符,再拼接成正则模式,这样括号会被转义为\(和\),正则引擎会当作字面字符处理:
a <- c("Apple", "Facebook", "Google (1992)") b <- c(1, 2, 3) c <- data.frame(a, b) d <- c %>% distinct(a) %>% pull() %>% str_escape() c %>% filter(str_detect(a, paste(d, collapse = "|"))) %>% group_by(a) %>% tally()
两种方法都能让你得到包含"Google (1992)"的预期结果。
内容的提问来源于stack exchange,提问作者Jhin Tonic
相关产品推荐
相关产品推荐

