在列表R中查找带有正则表达式的连字符字

在列表R中查找带有正则表达式的连字符字,r,regex,grepl,hyphen,R,Regex,Grepl,Hyphen,我有一个由分号分隔的元素组成的字符串,我想知道模式是否与字符串中的任何元素匹配: string <- "CPT1B;CPT1B;CPT1B;CHKB-CPT1B;CPT1B;CPT1B;CPT1B;CPT1B" 我使用了“[^;]”和“[$;]”,因为我希望在任何元素匹配时都得到TRUE 当我尝试匹配“CHKB-CPT1B”时,我的问题出现了,因为如果我使用相同的表达式: grepl(paste("[^;]","CHKB-CPT1B","[$;]",sep = ""),string) F

我有一个由分号分隔的元素组成的字符串,我想知道模式是否与字符串中的任何元素匹配:

string <- "CPT1B;CPT1B;CPT1B;CHKB-CPT1B;CPT1B;CPT1B;CPT1B;CPT1B"
我使用了“[^;]”和“[$;]”,因为我希望在任何元素匹配时都得到TRUE

当我尝试匹配“CHKB-CPT1B”时,我的问题出现了,因为如果我使用相同的表达式:

grepl(paste("[^;]","CHKB-CPT1B","[$;]",sep = ""),string)
FALSE
我猜错了,我想这是因为单词中的连字符,我想知道如何让grepl把连字符作为一个单词来读这个单词


我不想使用“CHKB \-CPT1B”,因为此模式将来自迭代器,迭代器可以是连字符和非连字符单词。我也不想将原始字符串拆分为“;”

您需要使用替换组:

grepl(paste0("(?:^|;)", "CPT1B", "(?:$|;)"),string)
[1] TRUE
(?:^ |)
非捕获组匹配字符串开头或
(?:$)
匹配字符串的结尾或

您还可以将lookarounds与
perl=TRUE
一起使用(即PCRE模式):


grepl(paste0)((?非常感谢!!!两种方法都适用于连字符词!!只有一件事,你能解释一下什么是“交替组”?@LaureTomásDaza交替组包含的内容。再次感谢!!这非常有帮助,我将阅读这些关于“捕获/不捕获组”的帖子
grepl(paste0("(?:^|;)", "CPT1B", "(?:$|;)"),string)
[1] TRUE
grepl(paste0("(?<![^;])", "CPT1B", "(?![^;])"),string, perl=TRUE)