捕获重复组

时间:2014-02-11 19:11:04

标签: regex r

我正在尝试编写一个匹配的正则表达式并为我捕获以下内容...

字符串:17 + 18 + 19 + 5 + 21

此处(单独)捕获的数字存在于数组中[ - 17,18,21]。

请注意,字符串可以是n个字符长(遵循相同的\ d +模式),并且字符串中这些数字的顺序不固定。

提前致谢

3 个答案:

答案 0 :(得分:2)

鉴于此设置:

library(gsubfn)
s <- "17+18+19+5+21"
a <- c(17, 18, 21)

1)试试这个:

L <- as.list(c(setNames(a, a), NA))
strapply(s, "\\d+", L, simplify = na.omit)

,并提供:

[1] 17 18 21
attr(,"na.action")
[1] 3 4
attr(,"class")
[1] "omit"

2)或者:

pat <- paste(a, collapse = "|")
strapplyc(s, pat, simplify = as.numeric)

,并提供:

[1] 17 18 21

3)或此非正则表达式解决方案

intersect(scan(text = s, what = 0, sep = "+", quiet = TRUE), a)

[1] 17 18 21

ADDED 其他解决方案。

答案 1 :(得分:1)

简单地说:

(17|18|21)

它需要是一个全球匹配,所以在Pearl中它会是这样的:

$string =~ m/(17|18|21)/g

示例字符串:

21+18+19+5+21+18+19+17

匹配

"21", "18", "21", "18", "17"

工作正则表达式示例:

http://regex101.com/r/jL8iF7

答案 2 :(得分:1)

使用可以使用gregexprregmatches

vec <- "17+18+19+5+21"
a <- c(17, 18, 21) 

pattern <- paste0("\\b(", paste(a, collapse = "|"), ")\\b")
# [1] "\\b(17|18|21)\\b"

regmatches(vec, gregexpr(pattern, vec))[[1]]
# [1] "17" "18" "21"

请注意,这与确切的数字相符,即17177不匹配。