2012-05-30 58 views
3

無法找出正則表達式問題。限制數字字符的正則表達式是什麼?

我們正在尋找2個數字,然後連字符或空格然後6個數字。必須只有6個數字,因此,無論是字母字符還是某些標點符號或空格都必須遵循6個數字或6個數字必須位於字符串的末尾。

其他數字字符串中的其他地方允許的,只要它們是獨立的。

那麼,這些應該符合:

foo 12-123456 bar 
12-123456 bar 
foo 12-123456 
foo12-123456bar 
12-123456bar 
foo12-123456 
12-123456bar 99 
foo12-123456 99 

這些不應該匹配:

123-12345 bar 
foo 12-1234567 
123-12345bar 
foo12-1234567 

下面是我們使用的是:

\D\d{2}[-|/\ ]\d{6}\D

Expresso這是罰款。

但在我們的.NET應用程序運行真正的這個模式是不能匹配的例子,其中的6個數字是在字符串的結尾。

嘗試這樣做:

\D\d{2}[-|/\ ]\d{6}[\D|$]

,它仍然不匹配

foo 12-123456 
+0

嘗試'\ b \ d {2} [ - |/\] \ d {6} \ b' –

+0

@EugeneRyabtsev否這隻能找到「行尾」或空格。我們所說的任何非數字字符都定義了2/6數字的開始和結尾,包括行尾,字母,標點符號 – hawbsl

回答

4

我將重新從

你的模式必須是唯一的6位數字,所以不論是字母字符或某些標點符號或空格必須遵循的6號或6號必須結束字符串。

必須只有6個號碼,所以一定不是一個數字的第六號後

然後用負先行斷言來表達這種。同樣,在模式開始時,使用負面後顧斷言來說,無論前兩位數字是什麼,它都不是數字。總之:

var regex = new Regex(@"(?<!\d)\d{2}[- ]\d{6}(?!\d)"); 

var testCases = new[] 
        { 
         "foo 12-123456 bar", 
         "12-123456 bar", 
         "foo 12-123456", 
         "foo12-123456bar", 
         "12-123456bar", 
         "foo12-123456", 
         "123-12345 bar", 
         "foo 12-1234567", 
         "123-12345bar", 
         "foo12-1234567", 
        }; 

foreach (var testCase in testCases) 
{ 
    Console.WriteLine("{0} {1}", regex.IsMatch(testCase), testCase); 
} 

該生產六種True當時的4個False S,按要求。

斷言(?<!\d)(?!\d)分別表示'這裏沒有數字'和'這裏沒有數字'。

+0

感謝我所有測試用例的匹配。很好的解釋 – hawbsl

0

好了,根據您進一步編輯問題的答案是這樣的:^(?:.*?\D+?)?(\d{2}[-|/\ ]\d{6})(?:\D+?.*?)?$它所有的字符串相匹配並捕獲該數字。

UPD:添加了一些代碼來測試ANS顯示匹配。

MessageBox.Show(Regex.Replace(
    "1 foo 12-123456 bar\r\n12-123456 bar\r\nfo23o 12-123456\r\nfoo12-123456bar3\r\n" + 
    "12-123456bar\r\nfoo12-123456\r\n\r\nThese should not match:\r\n\r\n" + 
    "123-12345 bar\r\nfoo 12-1234567\r\n123-12345bar\r\nfoo12-1234567", 
    @"^(?:.*?\D+?)?(\d{2}[-|/\ ]\d{6})(?:\D+?.*?)?$", 
    @"[match, cap: '$1']", 
    RegexOptions.Multiline 
)); 
+0

感謝您的幫助。有點但不是真的。看到我的進一步編輯,其他數字可以在字符串中的其他地方使用,只要它們是分開的 – hawbsl

+0

再編輯一些。 –

+0

感謝尤金...... – hawbsl

1

這應做到:

(^|\D)\d{2}[- ]\d{6}($|\D) 

它查找該線的起點或非數字,那麼你提到的無論是2-6或2 6,然後的任何一個結束模式行或其他非數字。

編輯和perl的測試時,相匹配的第8,而不是下一個4.

C#可以具有其它的specifica爲正則表達式。我不確定是否需要或需要進行哪些更改。

+0

在目前的形式下,它也與\ D相匹配,並且不會捕獲任何東西,只會導致真假結果。也就是說,如果通過將\ d放在適當的位置來解決它的問題。 –

+0

對不起,但這並沒有爲我工作 – hawbsl

+0

改變和測試,它的工作原理。 – 0xCAFEBABE

相關問題