Wenn Sie eine Permutation eines Satzes von Elementen übereinstimmen soll, Sie könnte eine Kombination aus Rückverweisen und Null-Breite negative Forward-Matching verwenden.
Sagen Sie bitte eine dieser sechs Zeilen übereinstimmen soll:
123-abc-456-def-789-ghi-0AB
123-abc-456-ghi-789-def-0AB
123-def-456-abc-789-ghi-0AB
123-def-456-ghi-789-abc-0AB
123-ghi-456-abc-789-def-0AB
123-ghi-456-def-789-abc-0AB
Sie dies mit der folgenden regex tun können:
/123-(abc|def|ghi)-456-(?!\1)(abc|def|ghi)-789-(?!\1|\2)(abc|def|ghi)-0AB/
Die Referenzen zurück (\1
, \2
), können Sie beziehen sich auf Ihre vorherigen Übereinstimmungen, und die Null Breite vorwärts Matching ((?!...)
) können Sie eine Positionsübereinstimmung negieren, sagen, stimmen nicht überein, wenn die enthalten an dieser Stelle übereinstimmt. Die Kombination der beiden stellt sicher, dass Ihr Match eine legale Permutation der gegebenen Elemente ist, wobei jede Möglichkeit nur einmal auftritt.
So zum Beispiel in Ruby:
input = <<LINES
123-abc-456-abc-789-abc-0AB
123-abc-456-abc-789-def-0AB
123-abc-456-abc-789-ghi-0AB
123-abc-456-def-789-abc-0AB
123-abc-456-def-789-def-0AB
123-abc-456-def-789-ghi-0AB
123-abc-456-ghi-789-abc-0AB
123-abc-456-ghi-789-def-0AB
123-abc-456-ghi-789-ghi-0AB
123-def-456-abc-789-abc-0AB
123-def-456-abc-789-def-0AB
123-def-456-abc-789-ghi-0AB
123-def-456-def-789-abc-0AB
123-def-456-def-789-def-0AB
123-def-456-def-789-ghi-0AB
123-def-456-ghi-789-abc-0AB
123-def-456-ghi-789-def-0AB
123-def-456-ghi-789-ghi-0AB
123-ghi-456-abc-789-abc-0AB
123-ghi-456-abc-789-def-0AB
123-ghi-456-abc-789-ghi-0AB
123-ghi-456-def-789-abc-0AB
123-ghi-456-def-789-def-0AB
123-ghi-456-def-789-ghi-0AB
123-ghi-456-ghi-789-abc-0AB
123-ghi-456-ghi-789-def-0AB
123-ghi-456-ghi-789-ghi-0AB
LINES
# outputs only the permutations
puts input.grep(/123-(abc|def|ghi)-456-(?!\1)(abc|def|ghi)-789-(?!\1|\2)(abc|def|ghi)-0AB/)
Für eine Permutation von fünf Elementen, wäre es:
/1-(abc|def|ghi|jkl|mno)-
2-(?!\1)(abc|def|ghi|jkl|mno)-
3-(?!\1|\2)(abc|def|ghi|jkl|mno)-
4-(?!\1|\2|\3)(abc|def|ghi|jkl|mno)-
5-(?!\1|\2|\3|\4)(abc|def|ghi|jkl|mno)-6/x
Für Ihr Beispiel würde die regex seiner
/<a href="home.php" (class="link"|title="Home") (?!\1)(class="link"|title="Home")>Home<\/a>/
Ich mag @Josh Bushs Antwort unten viel, wie es ist, was für mich jetzt funktioniert, dass ich auf diese – Rick
stieß Nein, Sie können es nicht tun. Das ist einer der Gründe, warum Sie keine regulären Ausdrücke verwenden, um HTML (oder XML) zu analysieren. Verwenden Sie ein richtiges HTML-Parsing-Modul. ** Sie können HTML nicht zuverlässig mit regulären Ausdrücken analysieren, und Sie werden mit Kummer und Frustration konfrontiert. Sobald sich der HTML-Code von Ihren Erwartungen ändert, wird Ihr Code nicht mehr funktionieren. Siehe http: // htmlparsing.com/php für Beispiele, wie man HTML mit PHP-Modulen, die bereits geschrieben, getestet und debuggt wurden, richtig analysiert. –
Dies ist einer der vielen Gründe, warum Regexes nicht zum Parsen von XML oder HTML geeignet sind. –