使用grep在字符串中的任何位置以任何顺序匹配多个模式的最短方法是什么?优选在一条短线中使用碱R.
以下是一个例子:
我想找到matches
向量中包含所有 所有的所有元素,任意顺序,任意位置< / strong>在my_vector
的元素中一起使用,元素中包含它们之间的任何字符。
matches <- c("fe", "ve")
# 1 2 3 4 5 6 7 8 9
my_vector <- c("fv", "v", "f", "f_v_e", "fe_ve", "feve", "vefe", "fve" , "a")
# want 5, 6, 7
我可以这样做:
grep(paste0("(?=.*", paste0(matches, sep = ""), ")", collapse = ""),
my_vector,
perl = TRUE)
[1] 5 6 7
但是有更简洁的方法吗?在我的例子中,我有两个要匹配的元素,但我的实际问题有几个。
答案 0 :(得分:4)
避免regex/paste
的选项将是
which(grepl(matches[1], my_vector) & grepl(matches[2],my_vector))
#[1] 5 6 7
使其更具活力
which(Reduce(`&`, lapply(matches, grepl, my_vector)))
#[1] 5 6 7
或者@Jota提到grep
可以使用intersect
Reduce(intersect, lapply(matches, grep, my_vector))
如果matches
中有许多元素,则paste
方法可能无效......