有例外的正则表达式

Regular expresion with exceptions

我想知道向量中是否存在模式,比方说:

vector <- c(paste0(paste("MC", 1:25), c(rep("", 10), rep("-P1",10), rep("P1",5))), rep("RANDOM", 10),c("MC1","MC2","MC-3"), rep("MCRANDOM", 10))
vector

我想要带有 "MC" 且后跟数字的那些。在它们之间可以是数字、连字符或 space,然后是数字。我想排除那些属于较大代码的代码,即带有 P 和另一个数字的代码,例如:"MC 20-P1" "MC 21P1"。 这会检测到 MC 和编号:

vector[grepl("MC( |-)*[0-9]{1,}", vector)]

我尝试使用 ^ 进行排除,但我的尝试失败了:

vector[grepl("MC( |-)*[0-9]{1,}[^(-*)P]", vector)]

如何只匹配MC和数字? (在我的真实数据中是较大文本的一部分)

我们可以在这里指定开始(^)和结束($)来匹配以'MC'开始后跟space或[=13的字符串=] 然后一个或多个数字 (\d+) 直到最后

grep("^MC[- ]?\d+$", vector, value = TRUE)
#[1] "MC 1"  "MC 2"  "MC 3"  "MC 4"  "MC 5"  "MC 6"  
#[7] "MC 7"  "MC 8"  "MC 9"  "MC 10" "MC1"   "MC2"   "MC-3" 

如果 MC 可以是子字符串,则使用单词边界 (\b) 代替 ^