読者です 読者をやめる 読者になる 読者になる

『正規表現でどう書くの?』ひねくれた別解

CodeIQ

(※ジョーク記事です。)

問題及び模範解答

増井雄一郎(@masuidrive)さんの「正規表現でどう書くの?」問題解説記事 #正規表現|CodeIQ MAGAZINE より:

(引用ここから)

問題

PerlRubyの最新版でサポートしている正規表現を利用して、下記の条件にマッチするようにア、イ、ウを埋めて下さい。

正規表現: “123456″ =~ /([0-9]+)/
条件: $1 == “1″

正規表現: “123456″ =~ /([0-9]+)([0-9]+)/
条件: $1 == “23456″

正規表現: “123456″ =~ /123(45)4/
条件: マッチする

正規表現: “123456″ =~ /123(45)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" の部分がマッチしますが、下側の式はマッチしません。