2012-04-08 36 views
0

好吧,我有一個正則表達式,我需要它在多行字符串中查找匹配。這是我正在使用的字符串:正則表達式匹配第一行後停止

Device Identifier:  disk0 
Device Node:    /dev/disk0 
Part of Whole:   disk0 
Device/Media Name:  OCZ-VERTEX2 Media 

Volume Name:    Not applicable (no file system) 

Mounted:     Not applicable (no file system) 

File System:    None 

Content (IOContent):  GUID_partition_scheme 
OS Can Be Installed:  No 
Media Type:    Generic 
Protocol:     SATA 
SMART Status:    Verified 

Total Size:    240.1 GB (240057409536 Bytes) (exactly 468862128 512-Byte-Blocks) 
Volume Free Space:  Not applicable (no file system) 
Device Block Size:  512 Bytes 

Read-Only Media:   No 
Read-Only Volume:   Not applicable (no file system) 
Ejectable:    No 

Whole:     Yes 
Internal:     Yes 
Solid State:    Yes 
OS 9 Drivers:    No 
Low Level Format:   Not supported 

基本上我需要將每行分隔成兩個冒號作爲分隔符。我使用的正則表達式是:

@"([A-Za-z0-9\(\) \-\/]+):([A-Za-z0-9\(\) \-\/]+).*" 

它的工作,但只挑選了第一線,將其分爲兩組像我想,但它停止在這一點上。我嘗試了多行選項,但它沒有任何區別。

我必須承認我是新來的正則表達式世界。

任何幫助表示讚賞。

+3

你可以包含你正在使用的C#代碼嗎? – 2012-04-08 11:20:38

+0

我會回到我的電腦周圍。 – 2012-04-08 11:38:35

回答

2

下面的例子似乎工作,並且還使用命名組,使正則表達式的理解更容易一點。

var rgx = new System.Text.RegularExpressions.Regex(@"(?<Key>[^:\r\n]+):([\s]*)(?<Value>[^\r\n]*)"); 
    foreach (var match in rgx.Matches(str).Cast<Match>()) 
    { 
     Console.WriteLine("{0}: {1}", match.Groups["Key"].Value, match.Groups["Value"].Value); 
    } 

爲了好玩,這整個事情轉換成一個易於使用的詞典:

var dictionary = rgx.Matches(str).Cast<Match>().ToDictionary(match => match.Groups["Key"].Value, match => match.Groups["Value"].Value); 
+0

這正是我需要的。所添加的字典代碼以簡潔和優雅的方式實現了我所想要的。謝謝! – 2012-04-08 16:06:32

0

你的正則表達式的問題是最後一個。*。它匹配\ r \ n,因此整個休息字符串都是匹配的。

0

我建議使用String.Split來代替。假設你所有的鑰匙都是獨一無二的:

string[] lines = str.Split(new char[] { '\r', '\n'} , 
    StringSplitOptions.RemoveEmptyEntries); 

Dictionary<string, string> dict = lines.ToDictionary(
    line => line.Split(':').First(), 
    line => line.Split(new char[] { ':' }, 2).Last().Trim()); 
0

如果使用正則表達式選項SINGLELINE那麼.*同時符合全部剩餘字符串,所以只有一場比賽。

SINGLELINE告訴正則表達式解析器還接受換行符(即\n)上做.

比賽時,你甚至不需要。*呢?

替代,你使用它與正則表達式的選擇多行,使^ $比賽開始和線路,而不是字符串的結尾,你可以使用

^([A-Za-z0-9\(\) \-\/]+):([A-Za-z0-9\(\) \-\/]+)$ 

Aslong。