『正規表現でどう書くの?』ひねくれた別解
(※ジョーク記事です。)
問題及び模範解答
増井雄一郎(@masuidrive)さんの「正規表現でどう書くの?」問題解説記事 #正規表現|CodeIQ MAGAZINE より:
(引用ここから)
問題
Perl、Rubyの最新版でサポートしている正規表現を利用して、下記の条件にマッチするようにア、イ、ウを埋めて下さい。
正規表現: “123456″ =~ /([0-9]+ア
)/
条件: $1 == “1″
正規表現: “123456″ =~ /(イ
[0-9]+ア
)([0-9]+)/
条件: $1 == “23456″
正規表現: “123456″ =~ /123(ウ
45)4/
条件: マッチする
正規表現: “123456″ =~ /123(ウ
45)6/
条件: マッチしない
解答
ア:?
イ:?:
ウ:?= (もしくは、?<!)
(引用ここまで)
(まともな)別解現る
(イ)「?>」が不正解な理由は? http://t.co/VY9vNKfIcz /増井雄一郎(@masuidrive)さんの「正規表現でどう書くの?」問題解説記事 #正規表現|CodeIQ MAGAZINE https://t.co/RUbszlfLOw @codeiqさんから
— カニ戯(ry (@bananawani_mc) 2014, 10月 6
ひねくれた別解
私も別解を考えてみました。方針としては、模範解答がいずれも「?」を含んでいるので、「?」を使わない方向で。
ア:A|1*
イ:23456)( もしくは \B.*)(
ウ:|A
Ideone で実行:
http://ideone.com/nZojmy
どうだエヘン!
ちなみに、動作確認は Perl でのみ行っています。 Ruby のことは知りません。
以下、一応説明です。
1つ目の式:
“123456″ =~ /([0-9]+A|1*)/
説明:「A」は、文字列に現れない文字なら何でもいいのですが、ともかくこれで | の左側はマッチしないのでキャンセルできます。結局 $1 は 1* にマッチする "1" になります。
2つ目の式:
“123456″ =~ /(23456)([0-9]+A|1*)([0-9]*)/
説明:$1 == "23456" になるようにするのですから、先頭に (23456) と書いてしまうのが素直な書き方というものです(多分ね!)。ちなみに $2 と $3 には空文字列がマッチします。
3つ目・4つ目の式:
"123456" =~ /123(|A45)4/
"123456" =~ /123(|A45)6/
説明:これも「A」はほぼ何でもよく、 | の右側をキャンセルしています。これで、上側の式は "1234" の部分がマッチしますが、下側の式はマッチしません。