ゲーム作るくんのサイト
ゲーム作るくん
X

ゲーム『正規表現パズル』の紹介

この記事について

『正規表現パズル』というゲームを作ったんですが、

という部分があるため、ゲームを遊ばなくても全体の雰囲気が分かるよう、『正規表現パズル』のチュートリアルをドキュメントに起こしました。

興味を持っていただけたらこちらのリンクから遊んでいただけると幸いです。

正規表現パズル

ブラウザゲームなのでアプリのインストールなしで始められます。アカウント登録とかもないので、お気軽にどうぞ。

ゲーム版の方ではチュートリアルだけでなく、正規表現を使ったパズルも遊べるようになっているので、パズル好きの方もぜひ。

それでは、以下、ゲーム版から持ってきたチュートリアルになります。

はじめに

正規表現パズルの世界へようこそ!
このゲームは パズルゲーム なんですが、パズルを解くには 正規表現を知らないといけない という問題があるため…
まずは正規表現の チュートリアル を用意しました!
正規表現については十分わかってる! 面倒なチュートリアルは スキップ したい! という方はメニュー の パズル からパズル問題に飛んでくださいね!

※ パズル問題はこちらのゲーム版『正規表現パズル』から遊べます

正規表現パズル
…それでは! チュートリアルを始めます! わりと長くなりますが ご了承ください!
チュートリアルに 飽きたら パズルにいって、パズルが 解けなければ 戻ってくる、みたいな やりかたでもいいんですよ!

正規表現とは何か

では まずは! 正規表現とは何か? について説明しますね!
正規表現は 文章を検索するときに使う特別な書き方 です。

正規表現の例:郵便番号をひとつのパターンで表す

たとえば、郵便番号 は世の中に無数にあるわけですが…
正規表現を使うと \d{3}-\d{4} という ひとつのパターンで すべての郵便番号を検索できます!
マッチさせることば
1
2
3
-
4
5
6
7
6
6
0
-
0
0
5
1
7
5
4
-
1
3
1
1
マッチきんしワード
1
2
3
4
5
6
7
6
6
0
0
0
-
5
1
7
5
4
,
1
3
1
1
\d{3}-\d{4}

※ 「マッチさせることば」にマッチするような正規表現を入力する、というのがゲームの目的になっています。「マッチきんしワード」に一文字でもマッチさせてしまうと問題をクリアできないため、いろいろ考えないといけない…というゲームになります。

正規表現の例:表記ゆれをまとめる

「ウォーターサーバー」と「ウォータサーバ」のような 表記ゆれ がある場合でも…
ウォーター?サーバー? と書けば まとめて 検索することが可能です!
マッチさせることば
ウ
ォ
ー
タ
ー
サ
ー
バ
ー
ウ
ォ
ー
タ
ー
サ
ー
バ
ウ
ォ
ー
タ
サ
ー
バ
ー
ウ
ォ
ー
タ
サ
ー
バ
ウォーター?サーバー?
…という感じで、最初は難しく感じますが、一度覚えてしまえば 何かと便利なのが正規表現です!

チュートリアルの進め方

つづいては チュートリアルの進め方 について説明します!
まずは 画面上にある 「マッチさせることば」 の順番通りに もじパネル を選んでみてください!
マッチさせることば
マ
ッ
チ
マ
ッ
チ
こんな感じで、このチュートリアルでは 実際に正規表現を入力して 進めていきます。

ゲームのルール

「マッチさせることば」 に 完全にマッチすれば クリア! 「マッチきんしワード」 に ちょっとでもマッチしてしまうと アウト! というルールになっています。
マッチさせることば
ク
リ
ア
!
マッチきんしワード
ア
ウ
ト
!
ク
リ
ア
!
正規表現の書き方一覧は の 早見表 から見れますよ!

※ 早見表はこちら

それでは始めましょう!

文章の頭にマッチさせる

まずは ^ です! ^ は 文章の頭 を表す記号です!
例えば、いし という言葉だけなら単に いし と入力すればOKですが…
マッチさせることば
い
し
い
し
マッチきんしワードが 「めいし」 だった場合、「めいし」 の中にある 「いし」 にもマッチしてしまいます。
こういうときに! ^いし と書くと、文章の頭が 「いし」 で始まるものだけに絞ってマッチさせることができます!
マッチさせることば
い
し
マッチきんしワード
め
い
し
^
い
し
め

※ 正解は「^いし」なんですが、ゲームではプレイヤーに考えてもらうよう「め」の文字もあえて候補の中に入れています。

便利ですよね!
ちなみに、この ^ のような特殊な記号のことを正規表現の世界では メタ文字 と呼んでいます。
それでは ^ を 使った問題を続けます!
^ を使って た で 始まる 文章だけに絞り込みましょう!
マッチさせることば
た
ま
マッチきんしワード
あ
た
ま
^
た
ま
あ
^ を使って あめ にマッチしてしまうのを防ぎましょう!
マッチさせることば
め
マッチきんしワード
あ
め
^
あ
め
最後にこちら!
マッチさせることば
と
り
マッチきんしワード
し
り
と
り
^
と
り
し
り
以上で ^ の説明は終了です! お疲れ様でした!
ちなみに、^ には キャレット、カレット、ハット、やま などの呼び方があるらしいですよ!

文章の最後にマッチさせる

では、次は $ です! $ は 文章の最後 を表す メタ文字 になります!
さっそく問題です! たこあげ にマッチしないよう、たこ$ と 書いて文章を 区切って ください!
マッチさせることば
た
こ
マッチきんしワード
た
こ
あ
げ
た
こ
$
あ
げ
$ を使って か で 終わる 文章だけに絞り込みましょう!
マッチさせることば
い
か
マッチきんしワード
い
か
だ
い
か
$
だ
$ を使って へび で 終わる ようにしてください!
マッチさせることば
へ
び
マッチきんしワード
へ
び
い
ち
ご
へ
び
$
い
ち
ご
これは! ^ と $ 両方で あし の 前後 をはさむ必要があります!
マッチさせることば
あ
し
マッチきんしワード
あ
し
た
し
の
び
あ
し
^
あ
し
$
これも! ^ と $ で いぬ の前後を 区切って ください!
マッチさせることば
い
ぬ
マッチきんしワード
こ
い
ぬ
い
ぬ
く
^
い
ぬ
$
以上で $ の説明は終了です! お疲れ様でした!
^ や $ は文字そのものではなく 文字を区切る位置 を表すということに注意してくださいね!
ちなみに、$ は ドル、ドルマーク、ダラー などと呼ぶそうです!

文字の繰り返し

さて! 次は + です! + は 同じ文字の繰り返し を表す メタ文字 になります!
た が多い! こんなときに た+ と書けば たたたたた… という 繰り返し を表現できます!
マッチさせることば
た
た
た
た
た
た
た
た
た
た
た
た
た
た
た
+
る+ で る の 繰り返し を指定しましょう!
マッチさせることば
が
る
る
る
る
る
る
る
る
る
る
る
る
る
る
る
る
る
る
る
る
る
る
る
る
が
る
+
+ で 同じ文字の繰り返し を指定してください!
マッチさせることば
ぬ
め
め
め
め
め
め
ぬ
め
+
以上で + の説明は終了です! お疲れ様でした!
ちなみに、+ は プラス、たす などと呼ぶそうです!

文字クラス

次は [ ] です!
[ ] は 文字をまとめて指定 するときに使います!
例えばこのような場合、[がぎ]+ と書けば が と ぎ それぞれの繰り返しをまとめて 表現できます!
マッチさせることば
が
が
が
が
が
が
が
が
ぎ
ぎ
ぎ
ぎ
ぎ
ぎ
ぎ
ぎ
[
が
ぎ
]
+
[ ] と + を組み合わせて 0 と 1 が 混ざった繰り返し を指定しましょう!
マッチさせることば
0
1
0
1
0
1
0
1
0
0
0
0
0
0
0
0
1
1
1
1
1
1
1
1
[
0
1
]
+
[0-9] と書けば [0123456789] と書いたのと同じことになります! これが 文字の範囲指定 です!
マッチさせることば
8
0
4
5
0
0
0
0
0
0
[
0
-
9
]
+
[9-0] と逆に書いてしまうと動かないので注意してください!
マッチさせることば
3
4
2
3
1
3
4
0
マッチきんしワード
8
9
6
7
5
8
6
9
[
0
-
4
]
+
5
9
- 自体を表したい場合は [-0-9] や [0-9-] というように、- を 先頭 か 最後 に書けばOKです!
マッチさせることば
-
-
-
3
9
2
[
0
-
9
-
]
+
アルファベットの小文字 を表すには [a-z] と書き…
マッチさせることば
a
b
c
d
e
f
g
h
i
j
k
l
m
n
o
p
q
r
s
t
u
v
w
x
y
z
マッチきんしワード
A
B
C
[
a
-
z
]
+
アルファベットの大文字 を表すには [A-Z] と書けます。
マッチさせることば
A
B
C
D
E
F
G
H
I
J
K
L
M
N
O
P
Q
R
S
T
U
V
W
X
Y
Z
マッチきんしワード
a
b
c
[
A
-
Z
]
+
\d は [0-9] の 省略形 になります!
マッチさせることば
2
1
1
2
0
9
0
3
\d
+
\D は 数字以外 のすべての文字!
マッチさせることば
a
b
c
A
B
C
あ
い
う
!
#
%

マッチきんしワード
0
1
2
3
4
5
6
7
8
9
\D
+
\s は すべての 空白文字 !
マッチさせることば
\s
+
\S は 空白文字以外のすべて !
マッチさせることば
く
う
は
く
い
が
い
の
す
べ
て
の
も
じ
マッチきんしワード

\S
+
\w は [a-zA-Z0-9_] と同じ!
マッチさせることば
a
b
c
_
A
B
C
_
1
2
3
マッチきんしワード
に
ほ
ん
ご
く
う
は
く
\w
+
\W は [a-zA-Z0-9_] 以外 のすべて!
マッチさせることば
は
ん
か
く
え
い
す
う
じ
い
が
い
の
す
べ
て
の
も
じ
マッチきんしワード
a
b
c
_
A
B
C
_
1
2
3
\W
+
…というように、正規表現にはいろいろな 省略形 が用意されています。
それでは こちらの問題をどうぞ!
マッチさせることば
あ
か
い
あ
く
ま
あ
[
か
く
]
[
い
ま
]

文字クラスの否定

次は [^ ] の説明です! [^ ] は 指定した文字以外 を表します!
例えば [^あ] と書くと あ 以外のすべての文字 を表すことができます!
マッチさせることば
お
お
か
み
0
1
2
A
B
C
く
う
は
く
[
^
あ
]
+
[] の中で ^ そのものを表したい場合は [^a-z^] や [^^] のように 先頭以外の場所 に書けばOKです!
マッチさせることば
あ
い
う
え
お
マッチきんしワード
^
^
^
^
^
[
^
^
]
+
以上で [ ^ ] の説明は終了です! お疲れ様でした!
ちなみに、[ ] は かくかっこ、だいかっこ、かぎかっこ、ブラケット などと呼ぶらしいです。

複数の文を指定する

つづいては | です!
| を使うと 複数の文 を 同時に指定 できるようになります!
つ の と き ば の 間に | を置けば つの と きば の二つを同時に指定できます!
マッチさせることば
つ
の
き
ば
つ
の
|
き
ば
| は何個でも指定できますよ!
マッチさせることば
う
み
や
ま
い
え
う
み
|
や
ま
|
い
え
| の説明は以上です!
ちなみに、| は パイプ、パイプライン、たてぼう、たてせん などの呼び方があるんですって!

文字列単位のグループ化

どんどんいきます! 次は ( ) です!
( ) を使うと 文字列単位のグループ化 ができるようになります!
例えば、こういう場合に あか と くろ の部分だけを (あか|くろ) という書き方で グループ化 できます!
マッチさせることば
あ
か
い
く
ろ
い
(
あ
か
|
く
ろ
)
い
くい と づか をグループとしてまとめてみましょう!
マッチさせることば
あ
り
く
い
あ
り
づ
か
あ
り
(
く
い
|
づ
か
)
(ちゅう) と グループ にした上で + で繰り返せば短く書けますよ!
マッチさせることば
ち
ゅ
う
ち
ゅ
う
ち
ゅ
う
ち
ゅ
う
(
ち
ゅ
う
)
+
これも グループ化 を使えば短くできます!
マッチさせることば
ち
ょ
き
ち
ょ
き
ち
ょ
き
ち
ょ
き
ち
ょ
き
(
ち
ょ
き
)
+

グループ内の文字列を参照する

\1 と書くと ( ) の中でマッチした言葉を 参照 できます! (わん)\1\1 と書いてみましょう!
マッチさせることば
わ
ん
わ
ん
わ
ん
(
わ
ん
)
\
1
(にゃん)\1\1\1 と書くと \1 が にゃん を 参照し にゃんにゃんにゃんにゃん と書いたのと同じことになります!
マッチさせることば
に
ゃ
ん
に
ゃ
ん
に
ゃ
ん
に
ゃ
ん
(
に
ゃ
ん
)
\
1
\2 は2個目のグループを 参照 します! (わん)(にゃん)\1\2\1\2 と書いてみてください!
マッチさせることば
わ
ん
に
ゃ
ん
わ
ん
に
ゃ
ん
わ
ん
に
ゃ
ん
(
わ
ん
)
に
ゃ
ん
\
1
2
以上で ( ) の説明を終わります!
( ) は かっこ、まるかっこ、しょうかっこ、パーレン とか言うらしいですよ!

文字があったりなかったりする場合

次は ? です!
? を使うと あってもなくてもいい というタイプの指定ができます!
ー の後に ? を付ければ ー が あってもなくても マッチするようになりますよ!
マッチさせることば
ゾ
ン
ビ
ゾ
ン
ビ
ー
ゾ
ン
ビ
ー
?
み の後に ? を付けて、み が あってもなくてもマッチするようにしてみましょう!
マッチさせることば
み
か
ん
か
ん
み
?
か
ん
? の説明は以上です!
? は クエスチョンマーク、はてなマーク、疑問符 などの呼び方があるそうです。

0 文字以上の繰り返し

次は * です! * があれば 繰り返してもいいし繰り返さなくてもいい というややこしい指定ができますよ!
ー が なかったり、何個続くかわからない というような場合に * が使えます! ファイアー*! と書いてみてください!
マッチさせることば
フ
ァ
イ
ア
!
フ
ァ
イ
ア
ー
ー
ー
ー
ー
!
フ
ァ
イ
ア
ー
*
!
* を使ってマッチさせてみましょう!
マッチさせることば
う
わ
!
う
わ
あ
あ
あ
あ
あ
!
う
わ
あ
*
!

繰り返しの数を細かく指定する

{ , } を使うと 繰り返しの数を細かく 指定できます!
ー{5} と書くと ー を ぴったり5回繰り返す という意味になりますよ!
マッチさせることば
サ
ン
ダ
ー
ー
ー
ー
ー
!
サ
ン
ダ
ー
{
5
}
!
ー{4,} で ー の 4回以上の繰り返し を表せます!
マッチさせることば
ブ
リ
ザ
ー
ー
ー
ー
ド
!
ブ
リ
ザ
ー
ー
ー
ー
ー
ド
!
マッチきんしワード
ブ
リ
ザ
ー
ー
ド
!
ブ
リ
ザ
ー
ー
ー
ド
!
ブ
リ
ザ
ー
{
4
,
}
ド
!
ー{3,4} と書けば ー を 3回から4回繰り返す という意味になります!
マッチさせることば
ど
ー
ー
ー
ん
!
ど
ー
ー
ー
ー
ん
!
マッチきんしワード
ど
ー
ー
ん
!
ど
ー
ー
ー
ー
ー
ん
!
ど
ー
{
3
,
4
}
ん
!
5
以上で * { , } の説明を終わります! 疲れたらいったん休んでくださいね!
* は アスタリスク、アスター、ほし、スター などと、{ } は なみかっこ、ちゅうかっこ、ブレース、カーリーブラケット みたいに呼ぶらしいですよ!

すべてを表すメタ文字

次は . !
. はすべての文字を表します!
. は 改行以外 のあらゆる文字にマッチします!
マッチさせることば
ひ
ら
が
な
カ
タ
カ
ナ
ス
ペ
ー
ス
タ
ブ
a
b
c
d
A
B
C
D
1
2
3
4
!
%
&
@
.
+
改行にマッチさせたい場合は \n を使ってください!
マッチさせることば





\n
+
. と + を組み合わせればこんなに長い文章も一発ですよ!
マッチさせることば
せ
い
き
ひ
ょ
う
げ
ん
は
も
じ
れ
つ
の
し
ゅ
う
ご
う
を
パ
タ
ー
ン
で
あ
ら
わ
す
ひ
ょ
う
げ
ん
の
い
っ
し
ゅ
で
す
.
+
. の説明は以上です! . は ピリオド、ドット、てん、ぽち などと呼ぶんですって!

前後の言葉を考慮してマッチングさせる

※ ここでは「先読みアサーション」と「否定先読みアサーション」について説明しています。本当は「後読みアサーション」「否定後読みアサーション」も合わせて説明したかったんですが、Safari のバージョンによっては後読みアサーションをサポートしていないケースがあり、チュートリアルから除外したという経緯があります。ゲームの実装がブラウザの正規表現エンジンに依存している、という事情があり…。

お次は ( ? = ! ) です!
これを使うと 前後の言葉 を考慮したマッチングができるようになります!
.+(?=ねこ) と書くと ねこ が続く文にだけマッチするようになります!
マッチさせることば
く
ろ
ね
こ
ぶ
ち
ね
こ
と
ら
ね
こ
マッチきんしワード
く
ろ
ず
く
め
ぶ
ち
か
ま
す
と
ら
ば
さ
み
.
+
(
?
=
ね
こ
)
.+(?=どん) と書いた場合、どん の 手前 が 区切り として扱われ、どん 自体にはマッチしません!
マッチさせることば
ぎ
ゅ
う
ど
ん
ぶ
た
ど
ん
マッチきんしワード
ぎ
ゅ
う
に
く
ぶ
た
に
く
.
+
(
?
=
ど
ん
)
$ は 文の終わり を表す 区切り ですが、(?=いぬ) は いぬ の 手前 を 区切り にする、という意味になります!
マッチさせることば
し
ば
い
ぬ
あ
き
た
い
ぬ
.
+
(
?
=
い
ぬ
)
日付から 月の部分 だけ取り出す場合は .+(?=/) と書けますよ! (?=/) で / の 手前 を 区切り にしてるわけですね!
マッチさせることば
1
2
/
2
4
8
/
3
1
.
+
(
?
=
/
)
(?!) は (?=) の逆で、(?!じた) と書いた場合、じた 以外の言葉の 手前 が 区切り になります!
マッチさせることば
ね
こ
み
み
ね
こ
く
さ
マッチきんしワード
ね
こ
じ
た
ね
こ
(
?
!
じ
た
)
(?!あ) と書くと あ 以外の文字の 手前 が 区切り になります! この場合は い の 手前 ですね!
マッチさせることば
あ
あ
あ
い
い
い
あ
あ
い
い
い
あ
い
い
い
(
?
!
あ
)
.
+
(?!.*あ) と書いた場合は .*あ に マッチ しない 文字列の 手前 が区切りになります! この場合は い の 手前 です!
マッチさせることば
な
に
か
あ
あ
あ
い
い
い
べ
つ
の
あ
あ
い
い
い
こ
と
ば
あ
い
い
い
(
?
!
.
*
あ
)
.
+
日付から 日の部分 だけ取り出したい場合は (?!.*/) と書いて / の次の位置 を 区切り にしましょう!
マッチさせることば
1
2
/
2
4
8
/
3
1
(
?
!
.
*
/
)
.
+
以上で ( ? = ! ) の説明を終わります! もう少しで終わりです!
! は びっくりマーク、エクスクラメーションマーク、感嘆符、 = は イコール、等号 などと呼ぶんですって!

最短マッチと最長マッチ

それでは ? の説明に移ります!
? を使うと どこまでマッチさせるか を調整できます!
.+?あ という形で ? を付けると、最初に あ が出てきたところでマッチを終わらせることができます!
マッチさせることば
ひ
と
つ
の
「
あ
」
ふ
た
つ
の
「
あ
あ
」
み
っ
つ
の
「
あ
あ
あ
」
さ
あ
、
あ
さ
だ
!
.
+
?
あ
? を付けない場合は 一番最後の あ までマッチしますよ!
マッチさせることば
ひ
と
つ
の
「
あ
」
ふ
た
つ
の
「
あ
あ
」
み
っ
つ
の
「
あ
あ
あ
」
さ
あ
、
あ
さ
だ
!
.
+
あ
?
.*?あ は .+?あ と違って、あ の前に文字が なくても マッチします!
マッチさせることば
あ
あ
あ
、
そ
う
か
し
あ
い
の
あ
い
て
あ
、
あ
じ
さ
い
が
!
.
*
?
あ
+
? を付けなければ 最後の あ までマッチします!
マッチさせることば
あ
あ
あ
、
そ
う
か
し
あ
い
の
あ
い
て
あ
、
あ
じ
さ
い
が
!
.
*
あ
?
+
以上で ? の説明を終わります! あと一個!

メタ文字を普通の文字として扱う方法

最後に! . などの メタ文字 を普通の文字として扱いたい場合は \. というように頭に \ を付けてください!
マッチさせることば
.
^
$
[
]
*
+
\
.
^
$
[
]
*
+
以上でチュートリアルはすべて終了です! お疲れ様でした! これであなたも正規表現マスター!

ゲーム版正規表現パズル

こちらがゲーム版『正規表現パズル』になります。よかったらぜひ!

正規表現パズル

正規表現 早見表

正規表現 早見表
.あらゆる文字にマッチ
[あいう]
あ と い と う にマッチ
[^あいう]
あ と い と う 以外にマッチ
\d [0-9]数字
\D数字以外のすべて
[a-z]アルファベットの小文字
[A-Z]アルファベットの大文字
\sすべての空白
\S空白以外のすべて
\n改行文字
\tタブ文字
\w [a-zA-Z0-9_]
英数字とアンダースコア
\W
英数字とアンダースコア以外のすべて
^文の 頭 にマッチ
$文の 最後 にマッチ
あ(?=い)
あ の次が い ならマッチ
あ(?!い)
あ の次が い 以外ならマッチ
あ|いあ と い どちらにもマッチ
( )グループ化
(あ)(い)\1\2
マッチした文字列を
\数字 の形で参照
この場合 \1 は あ に \2 は い になる
?あってもなくてもマッチ
*0 回以上の繰り返し
+1 回以上の繰り返し
{n}ちょうど n 回の繰り返し
{n,}n 回以上の繰り返し
{n,m}n 〜 m 回の繰り返し
.*?あ
最初の あ までマッチ
あ の前に文字が なくても マッチ
.+?あ
最初の あ までマッチ
あ の前に 最低1文字 必要
.*あ
最後の あ までマッチ
あ の前に文字が なくても マッチ
.+あ
最後の あ までマッチ
あ の前に 最低1文字 必要