C# 使用带有';或';操作员和获取匹配组?

C# 使用带有';或';操作员和获取匹配组?,c#,regex,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])$ ,但如何获取

我有一些字符串在一个文件中的格式

rid="deqn1-2"  
rid="deqn3"  
rid="deqn4-5a"  
rid="deqn5b-7"  
rid="deqn7-8"  
rid="deqn9a-10v"  
rid="deqn11a-12c"
我想要一个正则表达式来匹配每个deqnX-Y,其中XY都是整数整数和字母组合,如果在某些变量中存在匹配存储XY。 我尝试使用正则表达式
(^(\d+)-(\d+)$|^(\d+[a-z])-(\d+[a-z])$
,但如何获取变量中匹配组的值? 对于两个整数之间的匹配,组应该是(我认为)

对于两个整数和字母之间的匹配,组合将是

Groups[4].Value
Groups[5].Value
如何确定实际发生的匹配,然后相应地捕获匹配组?

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

deqn(?:(?<match1>\d+)-(?<match2>\d+)|(?<match1>\d+\w+)-(?<match2>\d+\w+))\b
你根本不在乎。无论如何,其中一对将是空的。那么,如果你只是把结果解释为两者的结合呢?把他们打在一起就行了。第一对的第一值加上第二对的第一值,以及第一对的第二值加上第二对的第二值。这总是给出正确的结果

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

这个
devqn(\w+)-(\w+)
不会解决您的问题吗?如果您想知道发生了哪个匹配,可以使用if-elsecondition@rock321987
deqn(\w+)-(\w+)
也将匹配
rid=“deqn4-5a”,rid=“deqn5b-7”
,我只需要数字匹配,并获取每个数字或digitAlpha digitAlpha匹配的值,并获取变量中的每个值。如果存在数字匹配或digitAlpha digitAlpha匹配,是否要将匹配的数据保留在相同的捕获组中?是的…可能吗?我正在考虑使用分支重置,即
(?|)
但它在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);
}
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
    // ...
}