0

私はこのようなコンテンツを持っています:

var testInput =
    "05(testcontent)\r\n" +
    "06(testcontent2)\r\n" +
    "07(testcontent3)(testcontent4)" +
    "08(testcontent5)";

行ごとに1つのコード文字列と2つの値文字列を取得する必要があります。最初の行の場合:

  • コード:"05"
  • 値1:"testcontent"
  • 値2:空の文字列。

3行目:

  • コード:"07"
  • 値1:"testcontent3"
  • 値2:"testcontent4"

私が使用するパターン:

// (?<Code>[0-9]{2}) - 2 digit number
// \((?<Value1>.+)\) - First value, which is inside the parentheses.
// (\((?<Value2>.+)\))? - Second value, which also is inside the parentheses.
// The second value does not always exist. Which is why it has "?" at its end.
var testPattern = @"(?<Code>[0-9]{2})\((?<Value1>.+)\)(\((?<Value2>.+)\))?";

私が使用するコード:

var testRegex = new Regex(testPattern,
    RegexOptions.Compiled |
    RegexOptions.CultureInvariant |
    RegexOptions.ExplicitCapture |
    RegexOptions.Multiline);
foreach (Match match in testRegex.Matches(testInput))
    Console.WriteLine("{0}: {1} | {2}",
        match.Groups["Code"].Value,
        match.Groups["Value1"].Value,
        match.Groups["Value2"].Value);

私が得る結果:

05: testcontent |
06: testcontent2 |
07: testcontent3)(testcontent4)08(testcontent5 |

^パターンの最初と最後で使用すると$、さらに悪化します。

07: testcontent3)(testcontent4)08(testcontent5 |

それで、

  • 「RegexOptions.Multiline」を指定すると、なぜ^さらに$複雑になるのですか?
  • 私のパターンの何が問題になっていますか?
4

1 に答える 1

1

Value1またはValue2の中に閉じ括弧があることはありますか?[^)]+そうでない場合は、の代わりにのような否定文字クラスを使用することをお勧めし.+ます。その理由は.+、この場合、「貪欲」である(つまり、可能な限り繰り返す)ことが問題を引き起こしているためです。

于 2012-08-06T08:25:37.460 に答える