X(?:A()|B()){2}\1\2Y
In sostanza, si utilizza un gruppo di cattura vuoto per spuntare ogni elemento quando è abbinato, quindi il back-riferimenti in modo che tutto è stato verificato al largo.
essere consapevoli che questo si basa sul comportamento regex privi di documenti, quindi non c'è alcuna garanzia che funzionerà nel vostro sapore regex - e se lo fa, non c'è alcuna garanzia che sarà continuerà a lavorare come che si evolve sapore. Ma per quanto ne so, funziona in ogni sapore che supporta i riferimenti di ritorno. (EDIT: non funziona in JavaScript.)
EDIT: Tu dici che stai usando gruppi denominati per catturare parti della partita, che aggiunge un sacco di confusione visiva al regex, se non reale complessità. Bene, se ti capita di usare regex .NET, puoi comunque usare semplici gruppi numerati per le "caselle di controllo". Ecco un esempio semplicistico che trova e raccoglie a parte un po 'di stringhe mese-giorno senza conoscere il loro ordine 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"]);
}
Questo funziona perché in .NET, la presenza di gruppi denominati non ha alcun effetto sul l'ordinamento della non gruppi con nome. Ai gruppi con nome vengono assegnati dei numeri, ma i numeri iniziano con dopo l' l'ultimo dei gruppi senza nome. (So che sembra complicato in modo gratuito, ma ci sono buone ragioni per farlo in questo modo.)
Normalmente si desidera evitare l'uso di gruppi di cattura con nome e senza nome, specialmente se si utilizzano i riferimenti di ritorno, ma Penso che questo caso potrebbe essere un'eccezione legittima.
fonte
2010-04-08 01:25:10
Funziona! Poiché le mie espressioni A e B contengono un gruppo completo di gruppi, ho utilizzato i gruppi di acquisizione vuoti denominati: X (?: A (?) | B (? )) {2} \ k \ k Y –
Jimmy
@Jimmy: vedi la mia modifica sui gruppi nominati. –
Grazie per il suggerimento aggiuntivo. Sto usando .net, ma le mie stringhe A e B contengono anche un gruppo di gruppi di cattura non denominati (quando creo la regex uso RegexOptions.ExplicitCapture). Penso che usando?: In tutti questi gruppi crea più confusione rispetto all'utilizzo di due gruppi "fittizi". Ulteriori commenti benvenuto :) – Jimmy