2012-04-08 5 views
0

だから、正規表現があり、複数行の文字列で一致するものを見つける必要があります。これは私が使用している文字列です:最初の行が一致した後にRegexが停止する

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 

基本的に私はセパレータとしてコロンを使用して2つのグループに分けなければなりません。私が使っている正規表現は次のとおりです。

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

それは作業を行いますが、最初の行のみをピックアップし、私が望むように二つのグループに分離するが、それはその時点で停止します。私はMultilineオプションを試しましたが、何の違いもありません。

私は正規表現の世界に新しいことを認めなければなりません。

何か助けていただければ幸いです。

+3

使用しているC#コードを含めることはできますか? –

+0

私は自分のコンピュータの周りに戻ってきます。 –

答えて

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

これは私が必要としていたものです。追加された辞書コードは、私が簡潔でエレガントな方法で欲しかったものを正確に達成しました。ありがとう! –

0

Regexの問題が最後です。 \ 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

をので、そこにあります一致するのは1つだけです。

単一行は、さらにラインを受け入れるために正規表現パーサに指示しますが.

の試合をやったときに、あなたも必要です。*すべてで(すなわち\n)フィード?あなたは^ $試合開始や線ではなく、文字列の最後を作るために正規表現のオプション複数行でそれを使うよう

代替あなたは

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

Aslongを使用することができます。

関連する問題