2014-03-19 43 views
2

我有很多,其中存儲樣值的字符串:正則表達式,以適應無序列表

(40|21|33)(111|222|333)(1|2) 

正如你可以在上面看到的 - 有三個組,每個組由固定長度的一個或多個值的,但給定組中的值可以按任何順序發生(如果它是上升或下降,則不定義)。

我正在通過使用正則表達式查看數值組,並且我堅持用於檢測給定組(即(40|21|33))中是否存在一組值(即20 or 31)的方法。

我做了正則表達式,用於檢測是否有的即20 or 31值的任何,但是當有指定ALL值應該只適合:

(\()([0-9]{2}(\|)?)*((20(\|)?)|(31(\|)?))([0-9]{2}(\|)?)*(\)) 

有沒有一種方法來檢測如果給定組中有ALL給定的值,假設組中的值的順序是未知的?

只是爲了澄清

(40|31|20) - should fit since there are all values of search group (20,31) 
(40|22|20) - should not fit since there is only one value of search group (20,31) 
+0

要麼你不是很清楚,要麼我太愚蠢,無法理解你的問題 – aelor

+0

@aelor做了很少的編輯,也許這可以幫助 –

回答

2

你可以用positive lookahead assertions做到這一點:

\(    # Match (
(?=[^()]*\b21\b) # Assert that 21 can be matched within this group 
(?=[^()]*\b33\b) # Assert that 33 can be matched within this group 
\d+    # Match a number  
(?:    # Start of non-capturing group: 
\|    # Match | 
\d+    # Match a number 
)*    # any number of times, including 0 
\)    # Match) 

,或者在Java中:

Pattern regex = Pattern.compile(
    "\\(    # Match (\n" + 
    "(?=[^()]*\\b21\\b) # Assert that 21 can be matched within this group\n" + 
    "(?=[^()]*\\b33\\b) # Assert that 33 can be matched within this group\n" + 
    "\\d+    # Match a number \n" + 
    "(?:    # Start of non-capturing group:\n" + 
    " \\|    # Match |\n" + 
    " \\d+    # Match a number\n" + 
    ")*     # any number of times, including 0\n" + 
    "\\)    # Match)", 
    Pattern.COMMENTS); 

看到它live on regex101.com

+0

謝謝,這正是我一直在尋找的。 –