Aufwärmen: Regex, Papier, Schere
Dies ist die Herausforderung, die ich ursprünglich veröffentlichen wollte, bevor mir klar wurde, dass es eine sehr kurze Lösung gibt. Dennoch kann es ein interessantes Problem sein, sich auf die unten stehende Herausforderung vorzubereiten.
Schreiben Sie drei reguläre Ausdrücke R , P und S so, dass sie zyklisch nach Art von Rock, Paper, Scissors zusammenpassen. Insbesondere stimmt R mit S überein , S stimmt mit P überein und P stimmt mit R überein , aber R stimmt nicht mit P überein , S stimmt nicht mit R überein und P stimmt nicht mit S überein . Hier ist ein praktischer Tisch:
Regex Matches Doesn't match
R S P
P R S
S P R
Es spielt keine Rolle, was R , P und S an anderen Eingängen tun, auch nicht an sich.
Übereinstimmung bedeutet hier nur, dass ein (möglicherweise leerer) Teilstring der Eingabe übereinstimmt. Das Match muss nicht den gesamten Input abdecken.
Die Herausforderung: Regex, Papier, Schere, Eidechse, Spock
Für diese Herausforderung lösen Sie eine härtere Version des obigen Problems, die auf der RPS-Variante Rock, Paper, Scissors, Lizard, Spock (bekannt durch The Big Bang Theory ) basiert . In RPSLV gibt es fünf verschiedene Symbole, die sich in zwei Zyklen schlagen:
- Rock → Schere → Eidechse → Papier → Spock → Rock
- Rock → Eidechse → Spock → Schere → Papier → Rock
Sie sollten fünf reguläre Ausdrücke R , P , S , L und V schreiben , die diese Struktur imitieren, wenn sie einander als Eingabe gegeben werden. Hier ist die entsprechende Tabelle:
Regex Matches Doesn't match
R L, S V, P
L V, P S, R
V S, R P, L
S P, L R, V
P R, V L, S
Nur klar zu sein, sollten Sie nicht mit der Zeichenfolge übereinstimmen R
, P
usw., aber die anderen Regexes. Wenn zum Beispiel Ihre Regex R ist ^\w$
, müssen P und V mit der Zeichenfolge übereinstimmen ^\w$
, während S und L nicht übereinstimmen sollten.
Auch hier bedeutet Übereinstimmung nur, dass mindestens eine (möglicherweise leere) Teilzeichenfolge der Eingabe übereinstimmt. Das Match muss nicht den gesamten Input abdecken. Zum Beispiel \b
(Wortgrenze) stimmt überein hello
(am Anfang und am Ende), aber es stimmt nicht überein (^,^)
.
Sie können einen beliebigen Regex-Geschmack verwenden, geben Sie jedoch in Ihrer Antwort die Auswahl an und stellen Sie, wenn möglich, einen Link zu einem Online-Tester für den ausgewählten Geschmack bereit. Sie dürfen keine regulären Ausdrücke verwenden, mit denen Sie Code in der Hostsprache des Geschmacks aufrufen können (wie der e
Modifikator des Perl-Geschmacks ).
Trennzeichen (wie /regex/
) sind nicht im regulären Ausdruck enthalten, wenn sie als Eingabe für einen anderen eingegeben werden, und Sie können keine Modifikatoren verwenden, die sich außerhalb des regulären Ausdrucks befinden. In einigen Varianten können Sie weiterhin Modifikatoren mit Inline-Syntax wie verwenden (?s)
.
Ihre Punktzahl ist die Summe der Längen der fünf regulären Ausdrücke in Bytes. Weniger ist besser.
Es stellt sich heraus, dass es viel einfacher ist, eine funktionierende Lösung für dieses Problem zu finden, als es zunächst scheinen mag, aber ich hoffe, dass es ziemlich schwierig ist, eine optimale Lösung zu finden.
\b
(Wortgrenze) entspricht hello
(am Anfang und am Ende), aber es passt nicht zusammen (^,^)
. "