正規表現とは(全体像)
正規表現は、「こういう形の文字列」をまとめて表すための小さな言語のこと。たとえば「電話番号っぽい並び」や「メールアドレスっぽい並び」を、いちいち全部書き出さずにパターン1つで表せる。
身近な使い道は、文章の中から特定の形を探す(検索)、入力された文字が正しい形かチェックする(入力検証)、まとめて置きかえること。
ポイントは、ふつうの文字(そのままの意味)と、特別な意味を持つ記号(メタ文字)を組み合わせること。この記号の意味を知っていれば、パターンが読めるようになる。
詳しく:この記号だけ覚えれば戦える
ここが記事の心臓部。よく出る記号を整理する。
正規表現の主な記号
| 記号 | 意味 | |
|---|---|---|
| `a\ | b` | aまたはb(選択) |
| `*` | 直前を0回以上くりかえす | |
| `+` | 直前を1回以上くりかえす | |
| `?` | 直前が0回か1回(あってもなくても) | |
| `[abc]` | a・b・cのどれか1文字 | |
| `^` / `$` | 行のはじめ/行の終わり |
いちばん問われるのが、`*`・`+`・`?`の繰り返しの違い。ここを正確に押さえれば、まとまった得点源になる。
- `a*` … aが0個でもOK(""、"a"、"aa"…)
- `a+` … aが1個以上("a"、"aa"…。空はダメ)
- `a?` … aが0個か1個だけ
たとえば電話番号は `\d{3}-\d{4}-\d{4}` のように書ける(`\d`は数字、`{3}`は3個)。「数字3つ・ハイフン・数字4つ・ハイフン・数字4つ」という形が、一行で表せるわけだ。
もう一つ、理論で問われるのが有限オートマトンとの関係。
理論的な位置づけ
| 項目 | 内容 |
|---|---|
| 有限オートマトンと等価 | 正規表現で表せる範囲=有限オートマトンで認識できる範囲 |
| チョムスキー階層 | いちばん簡単な「正規言語(タイプ3)」にあたる |
つまり、正規表現は「状態を次々に移っていく単純な機械(有限オートマトン)」と同じ表現力を持つ、と覚えておけばいい。
わかりやすく言い換えると
要するに、正規表現は「文字列のひな型(テンプレート)」だ。
繰り返し記号は、求人票の「○名以上」みたいな条件だと思うと分かりやすい。
①`*`(0回以上)… 「0名でもOK」(いなくても成立)
②`+`(1回以上)… 「最低1名は必要」
③`?`(0か1回)… 「いてもいなくてもいいが、多くても1名」
この「最低何個必要か」の違いが、`*`と`+`と`?`の差だ。`*`だけ「ゼロでもOK」——ここが試験の狙い目だぞ。
試験のツボ
🔴 一番出る:繰り返し記号の違い
①`*`=0回以上(空もOK)
②`+`=1回以上(最低1個)
③`?`=0回か1回
🔴 次に出る:基本記号の読み方
①`a|b`=aまたはb/`[abc]`=a・b・cのどれか
②`^`=行のはじめ/`$`=行の終わり
🟡 押さえると安定:有限オートマトンと等価
①正規表現で表せる範囲=有限オートマトンで認識できる範囲
②チョムスキー階層の正規言語(タイプ3)
よくある間違い
①**「`*`は1回以上の繰り返しを表す」→ ✗** `*`は0回以上(空もOK)。1回以上は`+`。
②「`+`は0回でも成り立つ」→ ✗ `+`は1回以上。0回(空)は成り立たない。
③「正規表現は有限オートマトンより強力で、何でも表せる」→ ✗ 正規表現は有限オートマトンと同じ表現力。表せる範囲には限りがある。
試験での出題パターン
実際の問題でたしかめてみよう。
オリジナル問題1(繰り返し記号)
正規表現の繰り返し記号に関する次の記述のうち、正しいものはどれか。
- `*`は1回以上の繰り返しを表し、空(0回)の文字列にはあてはまらない
- `*`は0回以上の繰り返しを表し、空(0回)の文字列にもあてはまる記号だ
- `?`は2回以上の繰り返しを表し、1回だけの場合にはあてはまらない記号だ
- `+`は0回以上の繰り返しを表し、空(0回)の文字列にもあてはまる記号だ
解答は 2 だぜ。
`*`は「0回以上」の繰り返しで、空(0回)にもあてはまる。1回以上は`+`、0か1回は`?`、とセットで覚えとけ。
選択肢1は`*`を「1回以上」とする誤り。選択肢3は`?`を「2回以上」とする誤り(0か1回)。選択肢4は`+`を「0回以上」とする誤りで、`+`は1回以上だぜ。
| 選択肢 | 判定 | 理由 |
|---|---|---|
| 1 | ✗ | `*`は0回以上(空もOK) |
| 2 | ✓ | `*`は0回以上で空にもあてはまる |
| 3 | ✗ | `?`は0か1回 |
| 4 | ✗ | `+`は1回以上 |
オリジナル問題2(基本記号)
正規表現の基本記号に関する次の記述のうち、正しいものはどれか。
- `[abc]`はaとbとcがこの順番で連続して並んでいることだけを表す記号である
- `a|b`はaとbの両方が同時に出現していることを表す、論理積を意味する記号だ
- `^`は行の終わりを、`$`は行のはじめを表す、位置を示すための記号である
- `[abc]`はa・b・cのどれか1文字を表し、`a|b`はaまたはbを表す
解答は 4 だぜ。
`[abc]`は「a・b・cのどれか1文字」、`a|b`は「aまたはb」だ。文字クラスと選択、それぞれ「どれか1つ」を表す記号だな。
選択肢1は`[abc]`を「順番に連続」とする誤り。選択肢2は`a|b`を「両方同時(論理積)」とする誤り。選択肢3は`^`と`$`が逆だぜ。
| 選択肢 | 判定 | 理由 | |
|---|---|---|---|
| 1 | ✗ | `[abc]`はどれか1文字 | |
| 2 | ✗ | `a\ | b`は「または」 |
| 3 | ✗ | `^`が行頭、`$`が行末(逆) | |
| 4 | ✓ | `[abc]`はどれか1文字・`a\ | b`はまたは |
オリジナル問題3(理論的位置づけ)
正規表現の理論的な位置づけに関する次の記述のうち、正しいものはどれか。
- 正規表現は有限オートマトンよりはるかに強力で、どんな文字列も表せるとされる
- 正規表現と有限オートマトンはまったく無関係で、表現力に共通点はないとされる
- 正規表現は有限オートマトンと同じ表現力を持ち、正規言語に対応するものだ
- 正規表現は数値計算の専用記法で、文字列のパターンとは無関係なものである
解答は 3 だぜ。
正規表現は有限オートマトン(状態を移っていく単純な機械)と同じ表現力を持ち、チョムスキー階層の正規言語(タイプ3)に対応する。表せる範囲には限りがあるってことだな。
選択肢1は「はるかに強力・何でも表せる」が誤り。選択肢2は「無関係」が誤り。選択肢4は「数値計算の記法」が誤りで、文字列のパターン記法だぜ。
| 選択肢 | 判定 | 理由 |
|---|---|---|
| 1 | ✗ | 有限オートマトンと同じ範囲で限りがある |
| 2 | ✗ | 等価という深い関係がある |
| 3 | ✓ | 有限オートマトンと等価・正規言語に対応 |
| 4 | ✗ | 文字列のパターン記法である |
まとめ
押さえどころ
- 🔴 繰り返し記号 = `*`は0回以上(空もOK)、`+`は1回以上、`?`は0か1回。
- 🔴 基本記号 = `a|b`はまたは、`[abc]`はどれか1文字、`^`は行頭・`$`は行末。
- 🟡 理論 = 有限オートマトンと同じ表現力。チョムスキー階層の正規言語(タイプ3)。
次に学ぶ
- BNF記法・EBNF ── 文法を記号で表すもう一つの記法。正規表現(パターン)と並べて「形式的に言葉を扱う」世界が見えてくる。
- コンパイラの仕組み(字句解析) ── 正規表現はプログラムの単語を切り出す字句解析で実際に使われる。理論が実務につながる。
執筆: SikakuQuest編集部