1

非常に単純な正規表現を見つけようとしていますが、再構築できません。なぜ機能しないのですか。私は正規表現に興味があると思っていましたが、残念ながらそうではないようです:D

一致させたい式は次のとおりです。

interval=4|termination=2012-09-18 22:00:00|days=3

それによって、とにかくこのように見える一致する配列が必要です

match = array({"interval" => "4", "termination" => "2012-09-18 22:00:00", "days" = "3"});
//(pseudocode)

パターン名が必要なため、C#で使用しています。私はこのパターンでそれを試しました:

(.*)((termination=(?<termination>(.{19})))|(interval=(?<interval>(\d*)))|(days=(?<days>(\d*))))*(.*)

誰かが私が失敗した場所を指摘できますか?

事前にThx

4

3 に答える 3

3

私はあなたがPHPのバックグラウンドから来ていると信じていますstring.Split.

string str = "interval=4|termination=2012-09-18 22:00:00|days=3";
Dictionary<string,string> dict = str.Split('|')
                                    .Select(r => r.Split('='))
                                    .ToDictionary(t => t[0], t=> t[1]);

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

ここに画像の説明を入力

于 2013-02-12T12:26:26.970 に答える
1

|正規表現の特殊文字で、代替を意味します。リテラル に一致させたいので|、エスケープする必要があります。

interval=(?<interval>\d*)\|termination=(?<termination>.{19})\|days=(?<days>\d*)

また、不要と思われるキャプチャ グループを自由にクリーンアップすることもできます。メソッドで機能するように、正規表現も変更しましたRegex.Matches()

入力は指定された順序で表示されると想定しています。

于 2013-02-12T12:26:41.357 に答える
1

あなたが得ている結果は何ですか?貪欲な(.*)は文字列全体を消費し、他の部分 (接尾辞*) は 0 回一致すると確信しています。したがって、一致は成功しますが、キャプチャ グループは空になります。それはあなたが経験していることですか?

私の提案はSplit、Habib の提案どおりにすることですが、正規表現を修正したい場合は、次のようにします。

  • 最初のグループを非貪欲 (怠惰) にします。(.*?)
  • フィールドの順序を修正し、|nhahtdh の提案に従ってエスケープするか、次のようにします。
  • フィールドが順不同になる可能性がある場合は、0、1、または複数を受け入れるためにそれらを繰り返す必要があるかもしれません (正規表現には最適な仕事ではありませんが、実行可能です):

    (
        (termination=(...)|interval=(...)|days=(...))
        (\| (termination=(...)|interval=(...)|days=(...)) )*
    )?
    

    (読みやすくするためにスペースと改行が追加されています)

于 2013-02-12T12:26:47.813 に答える