使用带有'或'运算符的正则表达式并获得匹配的组?

时间:2018-01-28 04:03:14

标签: c# regex

我在格式

的文件中有一些字符串
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

如何确定实际发生的匹配,然后相应地捕获匹配的组?

2 个答案:

答案 0 :(得分:3)

由于C#不支持分支重置(?|),我们可以使用同名的命名捕获组,如

deqn(?:(?<match1>\d+)-(?<match2>\d+)|(?<match1>\d+\w+)-(?<match2>\d+\w+))\b

regextester demo

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);
}

dotnetfiddle demo

答案 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
    // ...
}