-2
const string input = "===== Action: [Action1]  State: [State1] by:[user1] at [timestamp1] =====    [Notes1]===== Action: [Action2]  State: [State2] by:[user2] at [timestamp2] =====    [Notes2]";

Regex expression = new Regex(@"===== Action: (?<Action>.*?)State:(?<State>.*?)by:(?<userid>.*?)at(?<timestamp>.*?)=====(?<Note>.*?)");

var results = expression.Matches(input);
foreach (Match match in results)
{
    Console.WriteLine("UserId:" + match.Groups["userid"].Value);
    Console.WriteLine("Action:" + match.Groups["Action"].Value);
    Console.WriteLine("State:" + match.Groups["State"].Value);
    Console.WriteLine("TimeStamp:" + match.Groups["timestamp"].Value);
    Console.WriteLine("Note:" + match.Groups["Note"].Value);
}

注を除くすべての値を正しく解析できました。私が間違っていたアイデアはありますか?

4

2 に答える 2

1

..(?======|$)の最後で使用するのを忘れていた正規表現では、最後まですべてが一致しますが、これはあなたが望むものではありません..regex(?<Note>.*?)

したがって、正規表現は次のようになります

===== Action: (?<Action>.*?)State:(?<State>.*?)by:(?<userid>.*?)at(?<timestamp>.*?)=====(?<Note>.*?)(?======|$)

SinglelineMode入力が改行で区切られている場合はオプションを使用

于 2013-02-27T16:57:33.773 に答える
1

私の精神的なデバッグセンスは.*?、あなたの正規表現の最後の は貪欲ではなく、スペースを0個しか拾わないことを教えてくれます(これは を満たす.*?)。

Note入力と正規表現の両方にいくつかのシンボルを使用して、末尾がどこにあるべきかを特定したいと思うかもしれません

于 2013-02-27T16:58:01.860 に答える