2017-03-09 124 views
0

在.NET中,我試圖將像這樣的字符串解析爲數字組。在 「A」 和 「B」 是可選的(而非固定的)字母:正則表達式與組?

111a222b333 --> groups: num1=111, num2=222, num3=333 
111   --> groups: num1=111 
111b333  --> groups: num1=111, num3=333 
b333   --> groups: num3=333 

我已經試過正則表達式包括:

(?<num1>\d+)?a?(?<num2>\d+)?b?(?<num3>\d+)? 
(?<num1>\d+)*.*(a(?<num2>\d+))*.*(b(?<num3>\d+))* 

但他們沒有工作。有什麼建議麼?

+0

你的第一個正則表達式開始一個多餘的「(」 – JosefScript

+0

「他們沒有工作。」 - ???以什麼方式,他們不工作難道他們給你的錯誤是他們不符合任何東西都是他們回國錯誤的東西?是你有什麼問題更爲具體。提供獨立的副本,並在一個最小的完整可驗證例如粘貼可運行的代碼有很大幫助 – Chris

+1

(http://stackoverflow.com/help/mcve)。第二個永不到達兩組三因爲星號是貪婪的點。 – JosefScript

回答

2

您需要結合?(零或一個),這樣一組(而不是捕獲組)的發言。

因此把這個:

a?(?<num2>\d+) 

分爲:然後

(?:a(?<num2>\d+))? 

完整的正則表達式是:

(?<num1>\d+)?(?:a(?<num2>\d+))?(?:b(?<num3>\d+))? 

這裏有一個live preview

正如你可以看到它正確地產生:

+0

我發現的第一個數字是可選的。我已經更新的問題。這個答案不再起作用。 –

+1

@GlenLittle我已經更新了答案,太一修改您的編輯。這包括實時預覽。 – Vallentin

1
(?<num1>\d*)?a?(?<num2>\d*)?b?(?<num3>\d*) 

你很近,只需要覆蓋數字不在那裏的情況。

Preview