2014-12-26 55 views
0

我試圖寫一個正則表達式來匹配一個數字列表,使得任何兩個元素都是不同的。我將使用它來驗證java jsf-webpage上的文本框字段。例如:如何寫一個匹配不包含兩個相同數字的數字列表的正則表達式

1, 23, 12 // ok 
1, 1, 2, 45 // fail 
1, 2, 4, 6, 7 // ok 
1, 2, 3, 3 //fail 

我寫的正則表達式^[1-9](|[0-9])+(|\s+)(|\s+,\s+[1-9](|[0-9])+(|\s+))+$,但它既2點4的例子我提供相匹配。我該如何糾正?

+0

@TheLostMind我提供這些輸入只是一個例子。 –

+0

爲什麼你不分割它們然後添加到Set? – TheLostMind

+0

@TheLostMind正因爲我不想添加用戶提供的任何垃圾數據到設置 –

回答

4

使用下面的基於negative lookahead的正則表達式。

^(?!.*\b(\d+)\b.*\b\1\b)\d+(?:,\s+\d+)+$ 

(?!.*\b(\d+)\b.*\b\1\b)在一開始聲稱,就不會有對我們將要匹配字符串任何重複的數字。 \b稱爲單詞字符和非單詞字符匹配的單詞邊界。

DEMO

上述非捕獲組後關閉+*如果你也想匹配包含了一個數字的字符串。

^(?!.*\b(\d+)\b.*\b\1\b)\d+(?:,\s+\d+)*$ 

DEMO

爪哇正則表達式將是

"^(?!.*\\b(\\d+)\\b.*\\b\\1\\b)\\d+(?:,\\s+\\d+)+$" 

實施例:

String[] s = {"1, 23, 12", "1, 2, 4, 6, 7", "1, 1, 2, 45", "1, 2, 3, 3", "1, 2, 1"}; 
for (String i: s) 
{ 
    System.out.println(i.matches("(?!.*\\b(\\d+)\\b.*\\b\\1\\b)\\d+(?:,\\s+\\d+)+")); 
} 

輸出:

true 
true 
false 
false 
false 
+0

不,它不是我正在尋找的。 '1,2,1'通過。 –

+0

哪裏? https://regex101.com/r/dU7oN5/7 –

+0

是否可以在逗號前匹配包含任意數量空格符號的字符串? –

相關問題