X(?:A()|B()){2}\1\2Y
Básicamente, se utiliza un grupo de captura vacía para marcar cada elemento cuando está emparejado, a continuación, las copias de las referencias asegurarse de que todo ha sido verificado fuera.
Tenga en cuenta que esto se basa en el comportamiento de expresiones regulares indocumentado, por lo que no hay garantía de que va a trabajar en su sabor expresiones regulares - y si lo hace, no hay garantía de que va a continuar a trabajar a medida que evoluciona de sabor. Pero hasta donde sé, funciona en todos los sabores que admiten referencias. (EDIT: no funciona en JavaScript.)
EDIT: Usted dice que está usando grupos nombrados para capturar partes del partido, lo que añade una gran cantidad de desorden visual para la expresión regular, si no la complejidad real. Bueno, si está usando expresiones regulares de .NET, aún puede usar grupos numerados simples para las "casillas de verificación". He aquí un ejemplo simplista que encuentra y recoge además un montón de cuerdas meses en día sin conocer su orden interno:
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"]);
}
Esto funciona porque en .NET, la presencia de grupos nombrados no tiene efecto en el ordenamiento de la no grupos con nombre Los grupos con nombre tienen números asignados, pero esos números comienzan en después de el último de los grupos sin nombre. (Sé que parece innecesariamente complicado, pero hay buenas razones para hacerlo de esa manera.)
Normalmente, debe evitar el uso de grupos de captura nombrados y no nombrados, especialmente si utiliza referencias anteriores, pero Creo que este caso podría ser una excepción legítima.
¡Funciona! Como mis expresiones A y B contienen un grupo completo de grupos propios, utilicé grupos de captura vacíos con nombre: X (?: A (?) | B (? )) {2} \ k \ k Y –
Jimmy
@Jimmy: ver mi edición sobre los grupos nombrados. –
Gracias por la sugerencia adicional. Estoy usando .net, pero mis cadenas A y B también contienen un grupo de grupos de captura sin nombre (cuando creo la expresión regular, uso RegexOptions.ExplicitCapture). Creo que usar?: En todos estos grupos crea más desorden que usar dos grupos denominados 'ficticios'. Comentarios adicionales bienvenidos :) – Jimmy