体験を伝える―『ガジェット通信』の考え方

面白いものを探しにいこう 本物を体験し体感しよう 会いたい人に会いに行こう 見たことのないものを見に行こう そしてそれをやわらかくみんなに伝えよう [→ガジェ通についてもっと詳しく] [→ガジェット通信フロアについて]

【選択式問題】正規表現パズル2解答と解説☆言語不問

正規表現パズル2

本問題は、置換結果と置換文字列から推理して、検索の正規表現を選択肢から選ぶというものでした。

それでは以下、各問題とその解答を見ていきましょう。

問題のオープニング

あなたは、正規表現の女神「レギュ=ラー」の神殿にやって来ました。

この神殿では、女神の出す問題に正解すれば富を約束され、間違うと死を約束されます。

あなたは、歴戦のプログラマーとして、女神に「えくすぷれっしょん!」と、くしゃみをさせなければなりません。

この神殿では、以下のような式が提示されます。

文字列1

検索 置換

文字列2

この「検索」に当てはまる正規表現を、選択肢から選びます。置換は全置換です。

また、置換文字列に「$1」「$2」…がある場合は、丸括弧で記憶した値(数値番目)に置換します。

// 仮想コードのルール
. … 任意の1文字
* … 直前の文字を0回以上繰り返し
+ … 直前の文字を1回以上繰り返し
^ … 先頭
$ … 末尾
w … アンダーバーを含む英数字
d … 数字
… 次の特殊文字をエスケープ
[xyz] … xyzいずれかの文字
[^xyz] … xyz以外の文字
(x) … xを記憶
Aaa|Bbb … Aaa or Bbb
置換文字列の$1 $2…丸括弧で記憶した数値番目に置換
置換文字列の(空文字)…空の文字列を指す

問題1

// 問題
2016年2月22日

? $1/$2/$3

2016/2/22

// 選択肢
(d)+D(d)+D(d)+d
(d+).(d+).(d+).
([0-9])年([0-9])月([0-9])日

それでは各選択肢の正規表現を解説していきます。

選択肢1「(d)+D(d)+D(d)+d」→置換結果「6/2/2日」。

「d」は数字1文字、「D」は数字以外1文字です。そして「d+」は、数字1文字以上です。しかし「(d)+」のように括弧を付けると、記憶されるのは数字1文字だけになってしまいます。そのため「2016年2月22」のうち「6」「2」「2」が記憶され、「6/2/2日」のように、数字の1文字ずつしか、置換結果に表れません。

選択肢2「(d+).(d+).(d+).」→置換結果「2016/2/22」。

「(d+)」は数字1文字以上を記憶します。また「.」は任意の1文字なので、年月日の1文字に対応します。そのため「2016/2/22」のように、意図した置換結果になります。

選択肢3「([0-9])年([0-9])月([0-9])日」→置換結果「2016年2月22日」。

「[0-9]」は、数字1文字です。「+」などで繰り返しを指定していないために、複数の数字にはマッチしません。そのためマッチせず置換は行われません。

そのため答えは、2番目の選択肢の『(d+).(d+).(d+).』になります。

以下、ブラウザのコンソールで確認できるように、JavaScriptのコードを示します。

// 参考コード

// 変数
var src = “2016年2月22日”;
var rep = “$1/$2/$3”;
var res = “2016/2/22”;

// 問題
console.log(r = src.replace(/(d)+D(d)+D(d)+d/g, rep), r == res);
console.log(r = src.replace(/(d+).(d+).(d+)./g, rep), r == res);
console.log(r = src.replace(/([0-9])年([0-9])月([0-9])日/g, rep), r == res);

// 出力結果
6/2/2日 false
2016/2/22 true
2016年2月22日 false

問題2

// 問題
I and You.

? $2 and $1

You and I.

// 選択肢
1 and 2
(.+) and (.+)
(w+) w+ (w+)

それでは各選択肢の正規表現を解説していきます。

選択肢1「1 and 2」→置換結果「I and You.」。

1 2次のページ
CodeIQ MAGAZINEの記事一覧をみる
  • 誤字を発見した方はこちらからご連絡ください。
  • ガジェット通信編集部への情報提供はこちらから
  • 記事内の筆者見解は明示のない限りガジェット通信を代表するものではありません。