2012-07-16 134 views
1

這裏是我用找到的形式RB \ d {4},SW \ d {4}和S \ d {4}的中轉號碼代碼:C#模式匹配失敗

Regex transitRegex = new Regex("^(RB|SW?)(<?transit>\\d{4}).*"); 
Match m1 = transitRegex.Match(transitNumber); 
if (m1.Success) 
{ 
    Regex transitRegexNoZeroes = new Regex("0+(<?transitNoZeroes>\\d+)"); 
    Match m2 = transitRegexNoZeroes.Match(m1.Groups["transit"].Value); 
    if (m2.Success) 
    { 
     transitNumber = m2.Groups["transitNoZeroes"].Value.ToString(); 
     MessageBox.Show(transitNumber, "Transit Number", MessageBoxButtons.OK); 
    } 
    else 
    { 
     transitNumber = m1.Groups["transit"].Value.ToString(); 
    } 
} 
else 
{ 
    MessageBox.Show("Could not find transit number in " + transitNumber, "Parsing Error", MessageBoxButtons.OK); 
} 

然而我無法匹配任何行。這是一個失敗的行的一個示例:

RB80720C1XX - Intermittent COMM lOSS ****CHRONIC**** 

對我的生活中,我想不出有什麼不對的正則表達式。任何建議表示讚賞。

問候。

編輯:編輯內部匹配以允許數字與前導零仍然包含零。

+1

非零的目標是什麼?它目前找到一個可能以零開始的數字,並且不包含零。在上面的情況下,它*應該*返回72(至少乍一看)。 – 2012-07-16 01:58:11

+0

你確定你的線條沒有領先空間嗎? – 2012-07-16 01:58:31

+0

解答這兩個問題。如果領先空格,我刪除了「^」,但結果相同。至於非零,我知道每個運輸號碼是由那些特定字母代碼後面的四位數表示的。這些數字可能包含前導零,需要將其剝離以便與不同格式的轉接號碼進行比較。你是對的,內部匹配是不正確的,因爲剝離的數字仍然可以合法包含零 - 但我甚至沒有進入內部代碼。 – Kevin 2012-07-16 02:02:39

回答

3

你的第一個模式是有點關閉。試試這個:

@"^(RB|SW?)(?<transit>\d{4})" 

請注意,問號的位置。您可以測試模式here

+0

[用手點擊額頭]非常感謝!我所做的只是看正則表達式。我完全錯過了那個語法錯誤。 – Kevin 2012-07-16 02:09:42