2013-12-23 84 views
0

代碼示例中讀出空間分隔的值:正則表達式C#

   string flowValues = @"(?<day>\d{2})\s+(?<val1>(\d+\.?\d+)|\w+)\s+(?<val2>(\d+\.?\d+)|\w+)?\s+(?<val3>(\d+\.?\d+)|\w+)\s+(?<val4>(\d+\.?\d+)|\w+)?\s+(?<val5>(\d+\.?\d+)|\w+)\s+(?<val6>(\d+\.?\d+)|\w+)?\s+(?<val7>(\d+\.?\d+)|\w+)\s+(?<val8>(\d+\.?\d+)|\w+)\s+(?<val9>(\d+\.?\d+)|\w+)?\s+(?<val10>(\d+\.?\d+)|\w+)\s+(?<val11>(\d+\.?\d+)|\w+)?\s+(?<val12>(\d+\.?\d+)|\w+)"; 
       regex = new Regex(flowValues, regexOptions); 
       inputData = "30  64.0   96.6 101 172 258 647 612 599 184 74.8 63.0";//fileContents[10 + i]; 
       match = regex.Match(inputData); 
       dataMatrix[i, 0] = match.Groups["val1"].Value; 
       dataMatrix[i, 1] = match.Groups["val2"].Value; 
       dataMatrix[i, 2] = match.Groups["val3"].Value; 
       dataMatrix[i, 3] = match.Groups["val4"].Value; 
       dataMatrix[i, 4] = match.Groups["val5"].Value; 
       dataMatrix[i, 5] = match.Groups["val6"].Value; 
       dataMatrix[i, 6] = match.Groups["val7"].Value; 
       dataMatrix[i, 7] = match.Groups["val8"].Value; 
       dataMatrix[i, 8] = match.Groups["val9"].Value; 
       dataMatrix[i, 9] = match.Groups["val10"].Value; 
       dataMatrix[i, 10] = match.Groups["val11"].Value; 
       dataMatrix[i, 11] = match.Groups["val12"].Value; 

這裏,match.Groups["val2"].Value;返回的值是96.6,而我希望它返回空字符串,而match.Groups["val11"].Value;是,而我希望它返回74.8空。

輸入數據是每個月對應天數的一些流量值。所以: enter image description here 請注意,這些值爲2008年。所以我們有一個值爲2月29日

回答

1

你不只是使用字符串拆分方法?它需要一個char分隔符數組。

+0

不能使用string.split作爲一些值將是空字符串作爲是對於所討論上述 – umbersar

+0

確定的疑難雜症的第二值的情況下。空的空間的目的是什麼?你能用這段代碼解釋一下你的目的嗎? –

+0

在上面的主要問題解釋... – umbersar

1

你的正則表達式是不必要的複雜......爲什麼不使用更簡單的東西,如:

(?:([\w.]+)|(?:\s+)) 

(例如:http://regex101.com/r/iN0qD0

或簡單

([\d.]+) 

(例如:http://regex101.com/r/wD7vH7

它會返回任意組的具體到什麼喲你想;雖然它們不是,但名稱爲捕獲組,您可以根據它們在返回的匹配組中的位置確定哪些是捕獲組。

我不知道如果我理解正確的,但如果你想弄清楚如何檢索捕捉出這個表情,這樣做:

dataMatrix[i, 0] = match.Groups[0].Value; 
dataMatrix[i, 1] = match.Groups[1].Value; 
dataMatrix[i, 2] = match.Groups[2].Value; 
dataMatrix[i, 3] = match.Groups[3].Value; 
dataMatrix[i, 4] = match.Groups[4].Value; 
dataMatrix[i, 5] = match.Groups[5].Value; 
dataMatrix[i, 6] = match.Groups[6].Value; 
dataMatrix[i, 7] = match.Groups[7].Value; 
dataMatrix[i, 8] = match.Groups[8].Value; 
dataMatrix[i, 9] = match.Groups[9].Value; 
dataMatrix[i, 10] = match.Groups[10].Value; 
dataMatrix[i, 11] = match.Groups[11].Value; 

您可以簡單地這樣進一步實施循環像(from 0 to 11, do) ...等。

+0

我需要值(或空字符串)填寫變量val1到val12,以便我可以填寫相應的矩陣...您的常規expresison不會提取它們 – umbersar

+0

@流浪者你說你需要在捕捉中包含空格?如果是這樣,那更容易了(不需要非捕獲組)。那會是'([\ w。] + | \ s +)' – brandonscript

+0

嗯......看起來我有點愚蠢,不掛斷。 – brandonscript

0

此正則表達式工作得很好:

(?<day>\d{2})\s+(?<val1>(\d+\.?\d+)|\w+)\s+(?<val2>(\d+\.?\d+)|\w+|\s{4})\s+(?<val3>(\d+\.?\d+)|\w+)\s+(?<val4>(\d+\.?\d+)|\w+|\s{4})\s+(?<val5>(\d+\.?\d+)|\w+)\s+(?<val6>(\d+\.?\d+)|\w+|\s{4})\s+(?<val7>(\d+\.?\d+)|\w+)\s+(?<val8>(\d+\.?\d+)|\w+)\s+(?<val9>(\d+\.?\d+)|\w+|\s{4})\s+(?<val10>(\d+\.?\d+)|\w+)\s+(?<val11>(\d+\.?\d+)|\w+|\s{4})\s+(?<val12>(\d+\.?\d+)|\w+)