我有这样的内容:
var testInput =
"05(testcontent)\r\n" +
"06(testcontent2)\r\n" +
"07(testcontent3)(testcontent4)" +
"08(testcontent5)";
我需要为每一行获取一个代码字符串和两个值字符串。 对于第一行:
"05"
"testcontent"
第三行:
"07"
"testcontent3"
"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 |
所以,
^
和$
会使事情变得更复杂?答案 0 :(得分:1)
你的Value1或Value2中是否会有右括号?如果没有,我建议使用一个否定的字符类,如[^)]+
而不是.+
。原因是.+
“贪婪”(即尽可能多地重复)会导致这种情况出现问题。