我在格式
的文件中有一些字符串rid="deqn1-2"
rid="deqn3"
rid="deqn4-5a"
rid="deqn5b-7"
rid="deqn7-8"
rid="deqn9a-10v"
rid="deqn11a-12c"
我希望正则表达式匹配每个 deqnX-Y ,其中 X 和 Y 两个整数 或 整数和字母组合 ,如果有匹配商店 X 且 Y 在某些变量中。
我尝试使用正则表达式(^(\d+)-(\d+)$|^(\d+[a-z])-(\d+[a-z]))$
,但如何获取变量中匹配组的值?
对于两个整数之间的匹配,这些组将是(我认为)
Groups[2].Value
Groups[3].Value
并且两个整数和字母组合之间的匹配将是
Groups[4].Value
Groups[5].Value
如何确定实际发生的匹配,然后相应地捕获匹配的组?
答案 0 :(得分:3)
由于C#不支持分支重置(?|)
,我们可以使用同名的命名捕获组,如
deqn(?:(?<match1>\d+)-(?<match2>\d+)|(?<match1>\d+\w+)-(?<match2>\d+\w+))\b
C#代码
String sample = "deqn1-2";
Regex regex = new Regex("deqn(?:(?<match1>\\d+)-(?<match2>\\d+)|(?<match1>\\d+\\w+)-(?<match2>\\d+\\w+))\\b");
Match match = regex.Match(sample);
if (match.Success) {
Console.WriteLine(match.Groups["match1"].Value);
Console.WriteLine(match.Groups["match2"].Value);
}
答案 1 :(得分:0)
你可以简单地不关心。无论如何,其中一对将是空的。那么如果您只是将结果解释为两者的组合呢?把它们打在一起吧。第一对的第一个值加上第二对的第一个值,第一个对的第二个值加上第二个对的第二个值。这总能给出正确的结果。
Regex regex = new Regex("^deqn(?:(\\d+)-(\\d+)|(\\d+[a-z])-(\\d+[a-z]))$");
foreach (String str in listData)
{
Match match = regex.Match(str);
if (!match.Success)
continue;
String value1 = Groups[1].Value + Groups[3].Value;
String value2 = Groups[2].Value + Groups[4].Value;
// process your strings
// ...
}