2013-04-15 18 views
0

我要匹配這樣的:C#匹配字符串使用可選參數

01+WhATEver 02+0.1 03+12.1\r\n 

或本

01+WhATEver 02+0.1\r\n 

出現這樣我以任意順序

01+WhATEver 02+0.1 03+12.1\r\n01+WhATEver 02+0.1 03+12.1\r\n01+WhATEver 02+0.1 03+12.1\r\n 

解析字符串01-02是強制性的,03是可選參數。一個索引看起來像「01+」,後面可以跟着一個減號。

01+WhATEver 02+-0.1\r\n 

我能夠解析強制性索引和變量,但不包括可選的一個...因爲如果缺少它將不匹配。

01\\+\\s*(?<1>[.0-9A-Za-z]*)\\s*02\\+\\s*(?<2>[.0-9]*)\\s*03\\+\\s*(?<3>[.0-9]*)\\s* 

我需要的是一個正則表達式,它可以與包含許多這樣的子字符串的字符串01-02或01-03匹配。

+3

爲什麼你需要用正則表達式1做這一切? –

+1

cb88,只是想,你的隊友會讀這個正則表達式。 – I4V

+0

@SamIam我正在使用現有的代碼,除了可選的參數出現的情況外,已經可以工作了。我也是隊友閱讀這個...我沒有寫。就個人而言,我甚至不會使用正則表達式:/這就是它將會如何。這也是一個簡化的例子:P – cb88

回答

1

難道你不能只讓該組可選?就像這樣:

"01\\+\\s*(?<1>[.0-9A-Za-z]*)\\s*02\\+\\s*(?<2>[.0-9]*)(\\s*03\\+\\s*(?<3>[.0-9]*)\\s*)?" 
                ^       ^^ 

(我強調,我加入到正則表達式的字符。)

+0

我相信你在這裏是正確的,但我需要進一步調查......但我認爲現在的問題是我在匹配字符串後如何處理集合。 – cb88

+0

這確實匹配正確,但匹配組中的組數總是包含可選組,即使它不是字符串的一部分。所以這決定了解析它還是沒有問題。 – cb88

+0

你是對的我能夠檢測到我通過match.groups [index] .captures.count捕獲了組。 – cb88