2014-02-11 76 views
0

我想寫一個正則表達式,將匹配和捕捉我下面......捕捉重複組

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

號在這裏拍攝(單獨)出現在陣列中 - [17,18,21]。

請注意,字符串可以是n個字符長(遵循\ d +的相同模式),並且這些數字在字符串中的順序不固定。

在此先感謝

+0

什麼語言/正則表達式引擎? – Paulpro

+0

所以你試圖忽略第三和第四個元素的每一個倍數或每個19或5的倍數? – tenub

+0

忽略除數組之外的每一個數字...... – user1755645

回答

1

如何簡單:

(17|18|21) 

它需要一個全球性的比賽,所以在珍珠這將是這樣的:

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

例字符串:

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

匹配:

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

工作正則表達式的例子:

http://regex101.com/r/jL8iF7

+1

感謝您的解決方案..工作正常:)我只是忽略了全球比賽(杜) – user1755645

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附加解決方案。

+0

+1 FYI掃描需要一個'text'參數,不需要調用'textConnection'。 –

+0

謝謝。現在已經納入了。 –

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" 

注意這個確切的數字,即匹配,17不匹配177