Вы можете объединить несколько RegEx в 1, используя (pattern1) | (pattern1) | ...
Чтобы отрицать это, вы просто проверьте на! IsMatch
var matches = Regex.Matches("aa bb cc dd", @"(?<token>a{2})|(?<token>d{2})");
вернул бы фактически 2 токена (обратите внимание, что я использовал одно и то же имя дважды ... это нормально)
Также изучите Regex.Split. Например:
var split = Regex.Split("aa bb cc dd", @"(?<token>aa bb)|(?:\s+)");
возвращает слова как токены, за исключением слова "aa bb", которое возвращается как один токен, потому что я определил его так же с (? ...).
Вы также можете использовать свойства Index и Length для вычисления средних частей, которые не были распознаны регулярным выражением:
var matches = Regex.Matches("aa bb cc dd", @"(?<token>a{2})|(?<token>d{2})");
for (int i = 0; i < matches.Count; i++)
{
var group = matches[i].Groups["token"];
Console.WriteLine("Token={0}, Index={1}, Length={2}", group.Value, group.Index, group.Length);
}