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

基本的に、コロンをセパレータとして各行を 2 つのグループに分ける必要があります。私が使用している正規表現は次のとおりです。

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

それは機能しますが、最初の行のみをピックアップし、それを 2 つのグループに分けますが、その時点で停止します。Multiline オプションを試しましたが、違いはありません。

私は正規表現の世界に不慣れであることを認めなければなりません。

どんな助けでも大歓迎です。

4

4 に答える 4

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);
于 2012-04-08T11:31:06.123 に答える
0

正規表現の問題は、最後の .* です。\r\n に一致するため、残りの文字列全体が一致します。

于 2012-04-08T11:26:56.730 に答える
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());
于 2012-04-08T11:29:10.893 に答える
0

正規表現オプション SingleLine を使用している場合、.*while は残りの文字列全体と一致するため、一致するのは 1 つだけです。

SingleLine は、正規表現パーサーに\n、一致を行うときにライン フィード (つまり )を追加で受け入れるように指示します。.

.* も必要ですか?

使用できる代替手段

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

正規表現オプション MultiLine とともに使用して、^$ を文字列ではなく行頭と行末に一致させる限り。

于 2012-04-08T11:31:46.043 に答える