正規表現とは?文字列の『パターン』を記号で表す書き方

公開: 更新: カテゴリ: テクノロジ系

30秒で結論

正規表現とは(全体像)

正規表現は、「こういう形の文字列」をまとめて表すための小さな言語のこと。たとえば「電話番号っぽい並び」や「メールアドレスっぽい並び」を、いちいち全部書き出さずにパターン1つで表せる。

身近な使い道は、文章の中から特定の形を探す(検索)、入力された文字が正しい形かチェックする(入力検証)、まとめて置きかえること。

ポイントは、ふつうの文字(そのままの意味)と、特別な意味を持つ記号(メタ文字)を組み合わせること。この記号の意味を知っていれば、パターンが読めるようになる。


詳しく:この記号だけ覚えれば戦える

ここが記事の心臓部。よく出る記号を整理する。

正規表現の主な記号

記号意味
`a\b`aまたはb(選択)
`*`直前を0回以上くりかえす
`+`直前を1回以上くりかえす
`?`直前が0回か1回(あってもなくても)
`[abc]`a・b・cのどれか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 繰り返し記号の違い

正規表現の繰り返し記号に関する次の記述のうち、正しいものはどれか。

  1. `*`は1回以上の繰り返しを表し、空(0回)の文字列にはあてはまらない
  2. `*`は0回以上の繰り返しを表し、空(0回)の文字列にもあてはまる記号だ
  3. `?`は2回以上の繰り返しを表し、1回だけの場合にはあてはまらない記号だ
  4. `+`は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(基本記号)

📝 オリジナル問題 2 基本記号の読み方

正規表現の基本記号に関する次の記述のうち、正しいものはどれか。

  1. `[abc]`はaとbとcがこの順番で連続して並んでいることだけを表す記号である
  2. `a|b`はaとbの両方が同時に出現していることを表す、論理積を意味する記号だ
  3. `^`は行の終わりを、`$`は行のはじめを表す、位置を示すための記号である
  4. `[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 有限オートマトンとの関係

正規表現の理論的な位置づけに関する次の記述のうち、正しいものはどれか。

  1. 正規表現は有限オートマトンよりはるかに強力で、どんな文字列も表せるとされる
  2. 正規表現と有限オートマトンはまったく無関係で、表現力に共通点はないとされる
  3. 正規表現は有限オートマトンと同じ表現力を持ち、正規言語に対応するものだ
  4. 正規表現は数値計算の専用記法で、文字列のパターンとは無関係なものである
シーピードラ
シーピードラ 解答・解説

解答は 3 だぜ。

正規表現は有限オートマトン(状態を移っていく単純な機械)と同じ表現力を持ち、チョムスキー階層の正規言語(タイプ3)に対応する。表せる範囲には限りがあるってことだな。

選択肢1は「はるかに強力・何でも表せる」が誤り。選択肢2は「無関係」が誤り。選択肢4は「数値計算の記法」が誤りで、文字列のパターン記法だぜ。

選択肢判定理由
1有限オートマトンと同じ範囲で限りがある
2等価という深い関係がある
3有限オートマトンと等価・正規言語に対応
4文字列のパターン記法である

まとめ

押さえどころ

次に学ぶ


執筆: SikakuQuest編集部

勉強は、クエストになった。

資格の勉強を、冒険に変えるRPG学習アプリ

App Storeで見る