Ответ 1
X(?:A()|B()){2}\1\2Y
В принципе, вы используете пустую группу захвата для проверки каждого элемента, когда он согласован, тогда обратные ссылки гарантируют, что все было отключено.
Помните, что это зависит от недокументированного поведения регулярных выражений, поэтому нет гарантии, что он будет работать в вашем регулярном выражении - и если это произойдет, нет никакой гарантии, что он будет продолжать работать, поскольку этот аромат развивается. Но, насколько я знаю, он работает в каждом вкусе, который поддерживает обратные ссылки. (EDIT: он не работает в JavaScript.)
РЕДАКТИРОВАТЬ:. Вы говорите, что используете группы имен для захвата частей матча, что добавляет много визуального беспорядка в регулярное выражение, если не реальную сложность. Ну, если вы используете регулярные выражения .NET, вы можете использовать простые нумерованные группы для "флажков". Здесь упрощенный пример, который находит и выделяет кучу строк в течение месяца, не зная их внутреннего порядка:
Regex r = new Regex(
@"(?:
(?<MONTH>Jan|Feb|Mar|Apr|May|Jun|Jul|Sep|Oct|Nov|Dec)()
|
(?<DAY>\d+)()
){2}
\1\2",
RegexOptions.IgnorePatternWhitespace);
string input = @"30Jan Feb12 Mar23 4Apr May09 11Jun";
foreach (Match m in r.Matches(input))
{
Console.WriteLine("{0} {1}", m.Groups["MONTH"], m.Groups["DAY"]);
}
Это работает, потому что в .NET присутствие названных групп не влияет на упорядочение неименованных групп. Именованные группы имеют присвоенные им номера, но эти числа начинаются после последней из неименованных групп. (Я знаю, что это кажется безнадежно сложным, но есть веские причины для этого.)
Как правило, вы не должны использовать совместно используемые группы имен и неименованных групп, особенно если вы используете обратные ссылки, но я думаю, что этот случай может быть законным исключением.