2013-05-26 23 views
0
Regex regOrg = new Regex(@"org(?:aniser)?\s+(\d\d):(\d\d)\s?(\d\d)?\.?(\d\d)?", RegexOptions.IgnoreCase); 
MatchCollection mcOrg = regOrg.Matches(str); 
Match mvOrg = regOrg.Match(str); 

dayOrg = mvOrg.Value[4].ToString(); 
monthOrg = mvOrg.Value[5].ToString(); 
hourOrg = mvOrg.Value[2].ToString(); 
minuteOrg = mvOrg.Value[3].ToString(); 

這個正則表達式分析與可選參數的文本C# - 正則表達式不工作(比賽不保留字符串)

"organiser 23:59"/"organiser 25:59 31.12" 

"org 23:59"/"org 23:59 31.12" 

日期和月份字符串 因此,我想看到輸出變量dayOrg,monthOrg,hourOrg,minuteOrg與這個數據,但我得到這個:

Query: org 23:59 31.12 
The value mcOrg.Count: 1 
The value dayOrg: 2 
The value monthOrg: 3 
The value hourOrg: g 
The value minuteOrg: empty 

我在做什麼錯?嘗試了很多選擇,但它不起作用。

回答

2

您沒有正確訪問組(您正在訪問匹配字符串的單個字符)。

dayOrg = mvOrg.Groups[4].Value; 
monthOrg = mvOrg.Groups[5].Value; 
hourOrg = mvOrg.Groups[2].Value; 
minuteOrg = mvOrg.Groups[3].Value; 
1

您得到該結果的原因是因爲您從mvOrg Match獲得Value [index]。

匹配類,如MSDN所述,表示值是第一個匹配,因此您正在訪問第一個匹配的字符數組而不是組。您需要使用Match類的Groups屬性來獲取找到的實際組。

請務必在嘗試訪問可選參數之前檢查此集合的計數。

0

我給你加名字模式所以現在這個樣子:

  Regex regOrg = new Regex(@"org(?:aniser)?\s+(?<hourOrg>\d{2}):(?<minuteOrg>\d{2})\s?(?<dayOrg>\d{2})?\.?(?<monthOrg>\d{2})?", RegexOptions.IgnoreCase); 

,你可以像這樣訪問

 Console.WriteLine(mvOrg.Groups["hourOrg"]); 
     Console.WriteLine(mvOrg.Groups["minuteOrg"]); 
     Console.WriteLine(mvOrg.Groups["dayOrg"]); 
     Console.WriteLine(mvOrg.Groups["monthOrg"]); 

結果使用硬編碼索引是好的做法,因爲你可以改變正則表達式,現在需要改變所有的索引...
這是你想要的嗎?

+0

是的,謝謝! – user2422124

相關問題