2011-05-27 279 views
7

我需要能夠匹配一系列數字(19之間的任意數字),並且與用戶輸入的位數一樣多,但不匹配重複。使用正則表達式匹配一系列數字1-9,無重複

123456789 - >匹配
1223 - >不匹配

在效果上,數必須是1和9之間的位長,只包含數字,並且不重複任何數字。

我該如何使用正則表達式?

+2

數字是否必須排序? – Vache 2011-05-27 01:13:32

+0

不,沒有訂單。 – 2011-05-27 01:14:03

回答

3

類似下面應該工作:

(?!.*([1-9]).*\1)^[1-9]{1,9}$ 

(?!.*([1-9]).*\1) - 負先行檢查,如果數字不重複。

樣品匹配:http://regexr.com?2trr6

+0

我無法獲得與我的樣本編號匹配的結果:'12351874'。你可以嗎?編輯:除非他們不想要以前用於出現在字符串內的任何數字... – 2011-05-27 01:26:57

+0

這不應該匹配 - 重複數字「1」。此解決方案正確地說這不匹配。 – Tadmas 2011-05-27 01:28:37

+0

@布拉德克里斯蒂 - 抱歉,這裏不是很瞭解您的問題 – manojlds 2011-05-27 01:29:31

0
^(?:([1-9])(?!\1))+$ 

也就是說,一個數字,後面的東西是不一樣的數字,至少一次。

對不起,誤解了問題。我以爲你的意思是,如果連續使用兩次相同的號碼,它就會失敗。如果你想不重複的數字的整個序列,使用方法:

^(?:([1-9])(?!.*\1))+$ 
+0

問題不是很清楚,但我希望每個數字只允許一次,例如'123123'不會匹配。 – 2011-05-27 01:25:47

+0

不適用於「121」。 Regex.IsMatch返回true。 – Tadmas 2011-05-27 01:26:25

+0

不起作用 - http://regexr.com?2trqq – manojlds 2011-05-27 01:26:44

1

老實說,我用比C#更多的PHP,但這應該工作

^(?:([1-9])(?![1-9]*?\1))*$ 
0

這裏是一個不同解決方案。我就是這樣做的。除非讓代碼變得更加簡單,否則我不是一個超級looka/lookbehinds的粉絲。

string numbers = "123456789"; 
string example = "12345 1123456 19283741 987654321"; 

var matches = Regex.Matches(example, @"\d+"); 
for (int i = 0; i < matches.Count; i++) { 
    var match = matches[i].Value; 
    if (!numbers.Any(number => match.Count(x => x == number) >= 2)) { 
     Console.WriteLine(match); 
    } 
} 

如果你運行它,你會看到它打印:

12345 
987654321 

我認爲這是非常簡單的,我在這裏做什麼。

我從文本中提取所有的數字,不管它是否有重複的數字,然後,對於每個數字(1 - 9),它將只包含那些不包含多個重複的匹配。