Другой вариант, который не совсем то решение, которое вы хотели, но экономит вас, используя два отдельных регулярных выражения, - это использование именованных групп, если ваша реализация поддерживает это.
Вот немного C #:
var regex = new Regex(@"\=(?<Long>[0-9]+)\?|\+(?<Short>[0-9]+)\?");
string test1 = ";1234567890123456?+1234567890123456789012345123=9876543?";
string test2 = ";1234567890123456?+9876543?";
var match = regex.Match(test1);
Console.WriteLine("Long: {0}", match.Groups["Long"]); // 9876543
Console.WriteLine("Short: {0}", match.Groups["Short"]); // blank
match = regex.Match(test2);
Console.WriteLine("Long: {0}", match.Groups["Long"]); // blank
Console.WriteLine("Short: {0}", match.Groups["Short"]); // 9876543
По сути, просто измените свое регулярное выражение, включив в него имена, и затем регулярное выражение. У групп [GroupName] будет либо значение, либо значение. Вы можете даже использовать свойство Success группы, чтобы узнать, какие из них совпадают (match.Groups ["Long"]. Success).
UPDATE:
Вы можете получить название группы вне соответствия со следующим кодом:
static void Main(string[] args)
{
var regex = new Regex(@"\=(?<Long>[0-9]+)\?|\+(?<Short>[0-9]+)\?");
string test1 = ";1234567890123456?+1234567890123456789012345123=9876543?";
string test2 = ";1234567890123456?+9876543?";
ShowGroupMatches(regex, test1);
ShowGroupMatches(regex, test2);
Console.ReadLine();
}
private static void ShowGroupMatches(Regex regex, string testCase)
{
int i = 0;
foreach (Group grp in regex.Match(testCase).Groups)
{
if (grp.Success && i != 0)
{
Console.WriteLine(regex.GroupNameFromNumber(i) + " : " + grp.Value);
}
i++;
}
}
Я игнорирую 0-ую группу, потому что это всегда полное совпадение в .NET