我正在尝试编写一个匹配的正则表达式并为我捕获以下内容...
字符串:17 + 18 + 19 + 5 + 21
此处(单独)捕获的数字存在于数组中[ - 17,18,21]。
请注意,字符串可以是n个字符长(遵循相同的\ d +模式),并且字符串中这些数字的顺序不固定。
提前致谢
答案 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"
工作正则表达式示例:
答案 2 :(得分:1)
使用可以使用gregexpr
和regmatches
:
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"
请注意,这与确切的数字相符,即17
与177
不匹配。