2

に問題がありRegExます。に解析する必要がある文字列を受け取りましたNameValueCollection。(1) 文字列がスペースで区切られており、(2) 値にスペースを含めることができるため、ParseQueryString は機能しません。入力を制御することはできません。

文字列の例:

-AppCode='MyApplication' -AppVers='V-2016.0 Debug' -MachUuid='2C850880-34FD-12F3-A06B-7336B0C4BC55' -MachName='ABEZG-F05507' -Language=2055

スペースまたはハイフンを含む文字列値は、一重引用符で囲みます。整数値は引用符で囲みません。

私はもう試した:

  • [\w\-]+=[\w\s\']+(?![\w\-]+=[\w\s\'\-])

ただし、これは値にハイフンを許可しません

  • [\w\-]+=[\w\s\'\-]+(?![\w\-]+=[\w\s\'\-])

これは行いますが、スペース文字をオーバーランします。

理想的な出力は次のようになります。

-AppCode MyApplication
-AppVers V-2016.0 Debug
-MachUuid 2C850880-34FD-12F3-A06B-7336B0C4BC55
-MachName ABEZG-F05507
-Language 2055

残念ながら、何年経ってもまだわかりませんRegEx。どんな助けでも大歓迎です!

4

1 に答える 1

3

次の正規表現を使用できます。

(?<name>[\w-]+)=(?:'(?<value>[^']*)'|(?<value>\S+))

正規表現のデモを見る

([\w-]+)「名前」という単語とハイフン文字を名前付きグループにキャプチャします。は、一重引用符で囲まれた値 ( ) と空白以外( ) の(?:'(?<value>[^']*)'|(?<value>\S+))いずれかに一致しますが、名前が「値」のグループには、空白以外の値または引用符自体を除外した内部の内容のみが配置されます。'[^']*'\S+'...'

サンプルC# デモ:

var str = "-AppCode='MyApplication' -AppVers='V-2016.0 Debug' -MachUuid='2C850880-34FD-12F3-A06B-7336B0C4BC55' -MachName='ABEZG-F05507' -Language=2055";
var matches = Regex.Matches(str, @"(?<name>[\w-]+)=(?:'(?<value>[^']*)'|(?<value>\S+))")
    .Cast<Match>()
    .ToDictionary(p => p.Groups["name"].Value, p=> p.Groups["value"].Value );
foreach (var p in matches) {
    Console.WriteLine(p.Key + ": " + p.Value);
}

出力:

-AppCode: MyApplication
-AppVers: V-2016.0 Debug
-MachUuid: 2C850880-34FD-12F3-A06B-7336B0C4BC55
-MachName: ABEZG-F05507
-Language: 2055
于 2016-03-04T07:52:24.570 に答える