こちらの「正規表現クロスワード」にチャレンジしてみました。ルールは簡単で、書いてある正規表現にマッチするように文字を入れていくだけ。正規表現にマッチした列は色が紫色に変わります。マッチしていない列はオレンジ色です。入力した文字は自動で大文字に変わるので、いちいちShiftキーを押す必要はないです。
https://jimbly.github.io/regex-crossword/
かかった時間は2時間半くらいでした。
途中でにっちもさっちも行かなくなって一度リセットしたのが辛かったです(^ ^;)
感想としては「特定の文字列にマッチする正規表現を考える」ことは今まで何度もあったのですが、逆に「正規表現にマッチする文字列を考える」のはほとんどやったことがなかったので、いい勉強になりました。
解き方のコツとしては、ナンプレを解く感じで「必ずこの文字が入る」場所を探していくことです。例えば(AA)*E
と言う正規表現があった場合、最後の文字は必ずE
に固定されますね。
また、(〇〇|□□|△△)*
のパターンになっている列も当てはまる文字列を探しやすいです。一つのマスに対して正規表現は三つかかっているので、「このマスに〇〇を入れると他二つの正規表現にマッチするか?」と言うのをひたすらためします。すると「このマスにはこの文字列以外入る余地がない」というのが見つけられるはずです。
個人的には、(DI|NS|TH|OM)*
の列から攻めると攻略しやすいかなと思います。(...?)\1*
の列も、最初の2文字、または3文字が決まれば1列全てを埋められるので、早めに埋めてしまうと良いです。
.*
の列が二列ありますが、この列にはどんな文字を入れても大丈夫なので、詰まった時は正規表現に当てはまらない文字をうまくこの列へ逃してやると道が開けるかもしれません。
一つ学んだ点としては、\数字
で、一致した文字列を順番に参照できると言うことです。
普段使っているPhpstormで正規表現を用いた文字列置換を行う時では$数字
でマッチした文字列を取得していたのですが、これとの違いは$数字
は正規表現のマッチが終わった後に参照する変数であるのに対して、\数字
は、正規表現の最中にマッチした文字列を参照する時に使う、と言うことらしいです。
クロスワード中の列を例にあげると(.)(.)(.)(.)\4\3\2\1
と言う正規表現で、長さが8の回文にマッチさせることができると言うことですね。
逆に置換を行う時は「(.)(.)(.)(.)\4\3\2\1」 → 「$1$2$3$4」とすることで回文の前半部分だけを取り出せます。
使う機会があるかは分からないですが、覚えておこうと思いました。
最後にクロスワードの解答を載せておきます。ネタバレ注意です。
〜解答〜
