クロスマッチング正規表現


21

ここでのタスクは、2つの正規表現を作成することです。各正規表現は、他の正規表現と一致しますが、それ自体とは一致しません。

両方の正規表現には、次の形式が必要です。

/pattern/optional-flags

これは、それらが一致する形式でもあります。

最短のソリューションが勝ちます。ソリューションの長さは、スラッシュとフラグを含む両方の正規表現の文字の合計としてカウントされます。

違いがある場合は、選択した正規表現構文標準を使用するか、プログラミング言語を指定します。

楽しむ!


正規表現は、他の正規表現のスラッシュとフラグにも一致する必要がありますか?
ProgramFOX 14年

@ProgramFOXはい、わかりやすくするために行を追加しました。
GOTO 14

マッチを定義できますか?すなわち、正規表現は/a/一致しabcますか?
帽子の男14

2
@TheGuywithTheHatは、文字列全体を一致させる必要があるなど、特定の制限を課す言語を選択しない限り、そう思う。これはあなたの懸念に対処しますか?
GOTO 14

1
明確にするために、異なる区切り文字(PHP PCREなどで許可されている)の使用は許可されていないと思いますか?(すなわち無提出する/^%/%^/%
ピーター・テイラー

回答:


7

A修飾子付きPRCE:9文字

/A$/
/.A/A

これはDoorknobの/modifier$/答えの変形ですが、このイノベーションは彼に対するコメントではなく、別の答えとして修飾すると思います:修飾子は二重の義務を果たします。他の正規表現が一致するためだけに存在するのではなく、アンカーします。

最初の正規表現は、リテラルで終わる任意の文字列に一致しますA。2番目の正規表現は、A開始アンカーフラグを使用して、2番目の文字がリテラルである任意の文字列と一致します。

オンラインデモ


3
これに勝つために必要なのは4つの非区切り文字だけ//で、すべての正規表現が最大3つの非区切り文字を持つことができることを意味するため、すべてに一致します。PHP PCREを使用すると、その制約内に73339の非自己一致正規表現があり、長さが10未満のペアの徹底的なチェック(5.7Gpairsではなく、32Mpairsの大部分が区切り文字を含む5文字であるため)このソリューションと他のない。したがって、その特定の正規表現エンジンに最適であると主張しています。
ピーターテイラー14

18

4 + 6 = 10のスコア

最初の正規表現:

/i$/

2番目の正規表現:

/^.i/i

フラグの不正使用に感謝します!:-P

最初のものは、で終わるものすべてに一致しますi(したがって、iフラグを持つ正規表現)。

2番目の文字は、の2番目の文字と一致しiます。

オルタナティブバージョン:/i$/g/g$/i


3
別のバリエーションがあり/x.$//^.x/xの束のため
shiona 14年

または/i$/および/\/$/i
ピーターテイラー14年

あるいは、/i$/および/i\$/i
ピーター・テイラー

6

JavaScript正規表現、スコア:18

最初の正規表現:

/^[^a]+$/

2番目の正規表現:

/^[^b]+$/

JavaScriptテスト:

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

オンラインテスト:http : //jsfiddle.net/99Sx6/


5

Rubyの正規表現、15

正規表現:

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

文字を数えるだけ...

オンライン版

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

最初の正規表現:

/i$/

2番目の正規表現:

/\/$/i

i$iは、2番目の文字で終わるものに一致します。は、最初の1 /$で終わるものに一致します/


2
Doorknobの回答に投稿したコメントの二重。
ピーターテイラー14

@PeterTaylor今までコメントに気づかなかった。これらは独立した発見でした。
ジャスティン14

ええ、私も独立して塩奈のバージョンを発見しました。
ピーターテイラー14

3

5 + 5 = 10

正規表現#1:

/0.$/

正規表現#2:

/^.0/

0両方の正規表現のsは、非メタ文字に置き換えることができ、正規表現は引き続き機能します。

0.$0、2番目の最後の文字がの^.0すべてに一致し、2番目の文字がのすべてに一致し0ます。


2
最初のペアは有効な正規表現ではありません。esをエスケープする必要があります/。代替案は、Doorknobの回答に対するコメントのduです。
ピーターテイラー14

2

JavaScriptの正規表現、スコア:13

最初の正規表現:

/\d/

2番目の正規表現:

/^[^0]+$/

説明:最初の正規表現は数字を含むすべてに一致し、2番目の正規表現はを含まないすべてに一致します0

JavaScriptテスト:

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

オンラインでテストする:http : //jsfiddle.net/5VYjC/1/



2

スコア:5 + 5 = 10

把握するのに30分かかったが、やったことは本当にうれしい:)

1番目は: /j.$/

2番目は: /^.j/

1 j番目は、右から2番目の位置で発生したものに一致しました。j2番目は、左から開始して2番目の位置に一致します。

私はテストしていませんが、これらのRegExはj任意の\w文字(またはそれ以上?)に置き換えることができ、それでも正常に動作するはずなので、これらのRegExは本当に用途が広いと思います。

PSこれは(うまくいけば)どの言語でも動作するはずです。しかし、それがいずれでも機能しない場合は、以下のコメントでお知らせください:)

テスト


そして今、@ Quiccunxがすでに私のバージョンと同じバージョンを投稿していることがわかりました。Quiccunxは本当に申し訳ありませんが、もしそれが気に入ったら、答えを削除します。
ガランタンドン14

1

修飾子xを使用したPCRE:11文字

/\s/
/ s.$/x

最初は空白文字を含む文字列に一致しますが、空白文字は含まれません。2番目には空白が含まれていますが、x修飾子のために無視されます。最後から2番目の文字がの文字列に一致しますs

PCREおよび文字クラスを使用する他のエンジン:11文字

/\w+w/
/\Ww/

最初の文字列は、「単語」文字(文字、数字、アンダースコア)に続くリテラルの文字列に一致しますw。2番目は、非単語文字の後にリテラルが続く文字列と一致しますw

PCREおよび文字クラスと単語境界アンカーを使用する他のエンジン:11文字

/\w\w/
/\bw/

最初の文字列は、2つの連続した「単語」文字を持つ文字列に一致します。2番目の文字列は、単語以外の文字または文字列の先頭にリテラルが続く文字列wです。


-1

ECMAScript(11バイト):

/^\1?d/
/\d/

その他のREGEXPエンジン(14バイト):

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

1番目は\ d [..]または\ 1d [..]に一致します。

2番目は、数字のある文字列と一致します。

編集:

もともと、この回答はすべてのエンジンと互換性があると投稿されましたが、間違いであることが証明されました。

キャプチャグループへの参照に問題がありました(phpなど)。


多くの正規表現エンジンは、スラッシュを囲むことなく正規表現を使用しますが、カウントする必要があるという点で問題は明確です。
ピーターテイラー14年

私はそれを答えとして数えていません。そのためのメモを追加しましょう。
イスマエルミゲル14年

1
@PeterTaylorメモを追加しました。Apacheバージョンが存在する理由はそこにあります。
イスマエルミゲル14年

お待ちください:どのエンジンで最初のエンジンは\1逆参照として解釈されずに解析されますか?
ピーターテイラー14年

使用方法によって異なります。たとえば、PHPでは、内部に配置"/^\1?d/"すると問題が発生しますが、実行すると問題ありません'/^\1?d/'。コードが解釈されるとき、引用符は大きな違いをもたらします。
イスマエルミゲル14年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.