首页 > 解决方案 > 有异常的正则表达式

问题描述

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

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”的那些,后面跟着一个数字。它们之间可以是数字,也可以是连字符或空格,然后是数字。我想排除那些是较大代码的一部分,即带有 P 和另一个数字的代码,例如:“MC 20-P1”“MC 21P1”。这将检测具有 MC 和编号的那些:

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

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

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

我怎样才能只匹配带有 MC 和数字的那些?(在我的真实数据中是较大文本的一部分)

标签: rregexgrepl

解决方案


我们可以在此处指定 start ( ^) 和 end ( $) 以匹配以 'MC' 开头的字符串,后跟空格或-然后是一位或多位数字 ( \\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) 代替^


推荐阅读