正则表达式问题与嵌套组和模式中使用“^”和“$”

时间:2012-08-06 08:17:50

标签: c# regex string

我有这样的内容:

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

我需要为每一行获取一个代码字符串和两个值字符串。 对于第一行:

  • 代码:"05"
  • Value1:"testcontent"
  • Value2:空字符串。

第三行:

  • 代码:"07"
  • Value1:"testcontent3"
  • Value2:"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”时,为什么^$会使事情变得更复杂?
  • 我的模式出了什么问题?

1 个答案:

答案 0 :(得分:1)

你的Value1或Value2中是否会有右括号?如果没有,我建议使用一个否定的字符类,如[^)]+而不是.+。原因是.+“贪婪”(即尽可能多地重复)会导致这种情况出现问题。