在字符串中的任何位置以任何顺序匹配多个模式

时间:2016-07-13 04:30:50

标签: regex r

使用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 

但是有更简洁的方法吗?在我的例子中,我有两个要匹配的元素,但我的实际问题有几个。

1 个答案:

答案 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方法可能无效......