5

以下の形式の文字列があります。(改行が正しく表示されるようにマーカーを追加しました)

-- START BELOW THIS LINE --
2013-08-28 00:00:00 - Tom Smith (Work notes)
Blah blah

b;lah blah

2013-08-27 00:00:00 - Tom Smith (Work notes)
ZXcZXCZXCZX
ZXcZXCZX
ZXCZXcZXc
ZXCZXC


-- END ABOVE THIS LINE --

文字列の 2 つの別々の部分から情報を抽出できる正規表現を取得しようとしています。

次の式は、最初の部分と正常に一致します。

^(\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}) - (.*) \\(Work notes\\)\n([\\w\\W]*)(?=\n\n\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2} - .* \\(Work notes\\)\n)

文字列の 2 番目の部分を取得するように変更する方法を見つけようとしています。以下のようなことを試しましたが、文字列の最後まで一致を拡張してしまいます。ORの次の式を優先しているようなものです。

^(\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}) - (.*) \\(Work notes\\)\n([\\w\\W]*)(?:(?=\n\n\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2} - .* \\(Work notes\\)\n)|\n\\Z)

どんな助けでもいただければ幸いです

- 編集 -

これを正しく行うために作成したテスト プログラムのコピーを次に示します。また、3 番目のメッセージを追加しました。その場合、上記の RegEx が壊れます。

using System;
using System.Text.RegularExpressions;

namespace RegExTest
{
  class MainClass
  {
    public static void Main (string[] args)
    {
      string str = "2013-08-28 10:50:13 - Tom Smith (Work notes)\nWhat's up? \nHow you been?\n\n2013-08-19 10:21:03 - Tom Smith (Work notes)\nWork Notes\n\n2013-08-19 10:10:48 - Tom Smith (Work notes)\nGood day\n\n";
      var regex = new Regex ("^(\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}) - (.*) \\(Work notes\\)\n([\\w\\W]*)\n\n(?=\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2} - .* \\(Work notes\\)\n)",RegexOptions.Multiline);

      foreach (Match match in regex.Matches(str))
      {
        if (match.Success)
        {
          for (var i = 0; i < match.Groups.Count; i++)
          {
            Console.WriteLine('>'+match.Groups [i].Value);
          }
        }
      }

      Console.ReadKey();
    }
  }
}

- 編集 -

明確にするために、抽出しようとしているデータは、日付とタイムスタンプ (1 つの項目として)、名前、および各「段落」の「本文」です。

4

3 に答える 3

0

式を機能させることができましたが、少し怖いようです:

@"([0-9\s:-]+)(?>\s-\s)(?>[^\n\r]+[\r\n]*)((?=[^0-9]+(\d{4}-\d{2}-\d{2}|$))[\s\S])+"

これを逐語的な文字列にするための式の@前にあるため、すべてを二重にエスケープする必要はありません。

注:これは決して正しい方法ではありませんが、とにかく試してみたかったのです。

于 2013-08-28T15:35:48.240 に答える
0

正規表現はこれに適したソリューションではありませんが、必要な場合は...

あなたの問題は、正規表現の貪欲さと^で試合を開始することの組み合わせです。^ で始まる場合、文字列を開始するために必要であり、他のどこにも一致しません。

の貪欲さは、代わりに.*作ることで修正できます.*?

これを試して:

(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}) - (.*?) \(Work notes\)\n([\w\W]*?)((?=\n\n\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2} - .*? \(Work notes\)\n)|((\s{0,})$))
于 2013-08-28T14:56:34.753 に答える