Kreuzvergleiche reguläre Ausdrücke


21

Deine Aufgabe hier ist es, zwei reguläre Ausdrücke zu schreiben, von denen jeder mit dem anderen übereinstimmt, aber nicht mit sich selbst übereinstimmt.

Beide regulären Ausdrücke sollten folgende Form haben:

/pattern/optional-flags

Dies ist auch die Form, in der sie abgeglichen werden sollen.

Die kürzeste Lösung gewinnt. Die Lösungslänge wird als die Summe der Zeichen in beiden regulären Ausdrücken einschließlich Schrägstrichen und Flags gezählt.

Verwenden Sie einen Regex-Syntaxstandard Ihrer Wahl oder geben Sie eine Programmiersprache an, wenn dies einen Unterschied macht.

Habe Spaß!


Muss die Regex auch mit den Schrägstrichen und Flaggen der anderen Regex übereinstimmen?
ProgramFOX

@ProgramFOX ja, ich habe eine Zeile hinzugefügt, um dies zu verdeutlichen.
GOTO 0

Können Sie Übereinstimmung definieren? dh stimmt der reguläre Ausdruck /a/überein abc?
Der Typ mit dem Hut

2
@TheGuywithTheHat Nun, ich denke schon, es sei denn, Sie wählen eine Sprache, die bestimmte Einschränkungen auferlegt, z. B. die Notwendigkeit, die gesamte Zeichenfolge abzugleichen. Geht das auf Ihr Anliegen ein?
GOTO 0

1
Um es klar auszudrücken: Ich gehe davon aus, dass die Verwendung unterschiedlicher Trennzeichen (wie zB von PHP PCRE erlaubt) nicht erlaubt ist? (Dh kein Einreichen /^%/und %^/%)
Peter Taylor

Antworten:


7

PRCE mit dem Modifikator A: 9 Zeichen

/A$/
/.A/A

Obwohl dies eine Variante von Doorknob's ist /modifier$/ Antwort , aber ich denke, diese Neuerung qualifiziert sie eher als separate Antwort als als Kommentar zu seiner: Der Modifikator hat doppelte Pflicht. Anstatt nur für den anderen Regex da zu sein, verankert er sich.

Der erste reguläre Ausdruck entspricht einer Zeichenfolge, die mit einem Literal endet A. Der zweite reguläre Ausdruck entspricht einer beliebigen Zeichenfolge, deren zweites Zeichen ein Literal istA , wobei ein Startanker-Flag verwendet wird.

Online-Demo


3
Um dies zu übertreffen, sind nur vier Nicht-Begrenzer-Zeichen erforderlich, und da dies mit allem //übereinstimmt, bedeutet dies, dass jede der regulären Ausdrücke höchstens drei Nicht-Begrenzer-Zeichen haben kann. Unter Verwendung von PHP PCRE gibt es 73339 nicht selbst passende reguläre Ausdrücke innerhalb dieser Einschränkung, und eine erschöpfende Überprüfung der Paare mit einer Länge von weniger als 10 (in der Größenordnung von 32 MPaaren statt 5,7 GPaaren, da die meisten von ihnen 5 Zeichen einschließlich Begrenzer sind) wird durchgeführt Diese Lösung und keine anderen. Ich behaupte daher, dass es für diese spezielle Regex-Engine optimal ist.
Peter Taylor

18

4 + 6 = Punktzahl von 10

Erster regulärer Ausdruck:

/i$/

Zweiter regulärer Ausdruck:

/^.i/i

Hurra für Flaggenmissbrauch! :-P

Der erste stimmt mit allem überein, was mit i(also mit jedem regulären Ausdruck) endeti Flagge).

Der zweite stimmt mit einem zweiten Zeichen von überein i.

Alternative Version: /i$/gund /g$/i.


3
Eine andere Variante wäre /x.$/und /^.x/für ein paar x
shiona

Oder /i$/und/\/$/i
Peter Taylor

Oder /i$/und/i\$/i
Peter Taylor

6

JavaScript-Regexes, Punktzahl: 18

Erster regulärer Ausdruck:

/^[^a]+$/

Zweiter regulärer Ausdruck:

/^[^b]+$/

JavaScript-Test:

var regex1 = "/^[^a]+$/";
var regex2 = "/^[^b]+$/";
alert(/^[^a]+$/.test(regex2)); // true: regex1 matches regex2
alert(/^[^b]+$/.test(regex1)); // true: regex2 matches regex1
alert(/^[^a]+$/.test(regex1)); // false: regex1 doesn't match regex1
alert(/^[^b]+$/.test(regex2)); // false: regex2 doesn't match regex2

Online testen: http://jsfiddle.net/99Sx6/


5

Ruby Regex, 15

Reguläre Ausdrücke:

/.{9}/
/^.{06}$/

Nur Zeichen zählen ...

Online Version

r1 = '/.{9}/'
r2 = '/^.{06}$/'

p r1 =~ /^.{06}$/ #0:   r2 matches r1
p r2 =~ /.{9}/    #0:   r1 matches r2
p r1 =~ /.{9}/    #nil: r1 doesn't match r1
p r2 =~ /^.{06}$/ #nil: r2 doesn't match r2

5

4 + 6 = 10

Erster regulärer Ausdruck:

/i$/

Zweiter regulärer Ausdruck:

/\/$/i

i$stimmt mit etwas überein, das mit idem zweiten endet . /$stimmt mit etwas überein, das mit /dem ersten endet .


2
Betrogener Kommentar, den ich in Doorknobs Antwort gepostet habe.
Peter Taylor

@PeterTaylor Hat die Kommentare bis jetzt nicht bemerkt. Dies waren unabhängige Entdeckungen.
Justin

Ja, ich habe auch Shionas Version entdeckt.
Peter Taylor

3

5 + 5 = 10

Regex # 1:

/0.$/

Regex # 2:

/^.0/

Das 0s in beiden Regexen kann durch ein beliebiges Nicht-Metazeichen ersetzt werden, und der Regex funktioniert weiterhin.

0.$stimmt mit allem überein, dessen vorletztes Zeichen ist 0, und ^.0mit allem, dessen zweites Zeichen ist 0.


2
Das erste Paar sind keine gültigen regulären Ausdrücke: Sie müssen den /es entkommen . Die Alternative ist ein Betrug eines Kommentars zu Doorknobs Antwort.
Peter Taylor

2

JavaScript reguläre Ausdrücke, Punktzahl: 13

Erster regulärer Ausdruck:

/\d/

Zweiter regulärer Ausdruck:

/^[^0]+$/

Erläuterung: Der erste reguläre Ausdruck stimmt mit allem überein, das eine Ziffer enthält, und der zweite reguläre Ausdruck stimmt mit allem überein, das kein enthält 0.

JavaScript-Test:

var regex1 = "/\d/";
var regex2 = "/^[^0]+$/";
alert(/\d/.test(regex2)); // true: regex1 matches regex2
alert(/^[^0]+$/.test(regex1)); // true: regex2 matches regex1
alert(/\d/.test(regex1)); // false: regex1 doesn't match regex1
alert(/^[^0]+$/.test(regex2)); // false: regex2 doesn't math regex2

Online testen: http://jsfiddle.net/5VYjC/1/



2

Bewertung: 5 + 5 = 10

Ich habe eine halbe Stunde gebraucht, um herauszufinden, aber ich bin wirklich froh, dass ich es getan habe :)

1. ist: /j.$/

2. ist: /^.j/

Der 1. traf auf einen jin der zweiten Position von rechts ausgehenden Treffer. Die 2. Stelle entspricht einer jan zweiter Stelle stehenden Stelle beginnend von links.

Ich habe nicht getestet, aber ich denke, dass diese RegExs wirklich vielseitig sind, da jsie durch beliebige \wZeichen (oder mehr?) Ersetzt werden können und trotzdem funktionieren sollten.

PS Dies sollte (hoffentlich) in jeder Sprache funktionieren. Sollte dies nicht funktionieren, informieren Sie uns bitte in den Kommentaren unten :)

Prüfung


Und ich finde jetzt heraus, dass @Quiccunx bereits die gleiche Version wie meine gepostet hat. Es tut mir wirklich leid, Quiccunx, und wenn es jemandem gefällt, werde ich meine Antwort löschen.
Gaurang Tandon

1

PCRE mit dem Modifikator x: 11 Zeichen

/\s/
/ s.$/x

Die erste Zeichenfolge entspricht einer Zeichenfolge mit einem Leerzeichen, enthält jedoch kein Leerzeichen. Die zweite enthält Leerzeichen, wird jedoch aufgrund des xModifikators ignoriert . Es stimmt mit jeder Zeichenfolge überein, deren vorletzter Charakter ist s.

PCRE und andere Engines mit Zeichenklassen: 11 Zeichen

/\w+w/
/\Ww/

Die erste Zeichenfolge entspricht einer Zeichenfolge mit einem "Wort" -Zeichen (Buchstabe, Ziffer, Unterstrich), gefolgt von einem Literal w. Die zweite Zeichenfolge entspricht einer Zeichenfolge, die kein Wort enthält, gefolgt von einem Literal w.

PCRE und andere Engines mit Zeichenklassen und Wortgrenzenanker: 11 Zeichen

/\w\w/
/\bw/

Die erste Zeichenfolge entspricht einer Zeichenfolge mit zwei aufeinanderfolgenden "Wort" -Zeichen. Die zweite Zeichenfolge ist eine beliebige Zeichenfolge mit einem Nicht-Wort-Zeichen oder einem Zeichenfolgenanfang, gefolgt von einem Literal w.


-1

ECMAScript (11 Byte):

/^\1?d/
/\d/

Andere REGEXP-Engines (14 Byte):

/^\\\\1?d/
/\d/

Der 1. entspricht \ d [..] oder \ 1d [..].

Die Sekunde entspricht einer beliebigen Zeichenfolge mit einer Nummer.

BEARBEITEN:

Diese Antwort wurde ursprünglich als mit allen Motoren kompatibel eingestuft, hat sich jedoch als falsch erwiesen.

Es gab ein Problem mit Verweisen auf die Erfassungsgruppen (z. B. in PHP).


Viele Regex-Engines verwenden die Regex ohne umgebende Schrägstriche, aber die Frage ist ganz klar, ob sie gezählt werden müssen.
Peter Taylor

Ich zähle es nicht als Antwort. Lassen Sie mich die Notiz dazu hinzufügen.
Ismael Miguel

1
@PeterTaylor Ich habe die Notiz hinzugefügt. Die Apache-Version gibt es nur deshalb.
Ismael Miguel

Moment mal: In welchen Suchmaschinen wird die erste Analyse \1nicht als Rückverweis interpretiert?
Peter Taylor

Je nachdem, wie Sie es verwenden. In PHP zum Beispiel, wenn Sie hineinstecken, werden Sie "/^\1?d/"Probleme haben, aber wenn Sie das tun '/^\1?d/', dann ist es in Ordnung. Die Anführungszeichen machen einen großen Unterschied, wenn der Code interpretiert wird.
Ismael Miguel
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.