正規表現
プログラミングを勉強していると必ず出会う、魔法の言葉のような記号の羅列。それが「正規表現」です。英語で “Regular Expression” と言います。
JavaScriptでは、RegExp(レグエクスプ) オブジェクトを使います。
RegExpは 「魔法の虫めがね」 です。たくさんの文字の中から、自分の探したい「パターン」だけをピカッと光らせて見つけることができます。
I. 「正規表現」ってなに?
普通の検索(indexOf など)は、「特定の言葉」を探します。
RegExpは、「言葉のルール(パターン)」 を探します。
- 普通の検索: 「『田中』さんを探して」
- RegExp: 「『数字が3つ、ハイフン、数字が4つ』の形(電話番号)を探して」
このように、あやふやなルールで検索できるのがすごいところです。
II. RegExpオブジェクトの作り方
2つの書き方がありますが、よく使われるのは / /(スラッシュ) で囲む方法です。
// 1. スラッシュで囲む(リテラル) ★おすすめ
const pattern1 = /abc/;
// 2. new を使う
const pattern2 = new RegExp("abc");
III. よく使う「魔法の記号」(1)
正規表現(RegExp)のメタ文字は、文字の 「種類」 や 「数」 を指定する特別なルールです。 「トランプのジョーカー」 や 「算数のルール」 に例えて説明すると、パズルのように楽しく理解できます。
よく使われる7つの記号を、やさしく解説しましょう!
1. . (ドット)
→「なんでもいい一文字」
- イメージ: トランプの「ジョーカー」や、クイズの「穴埋(あなう)め」です。
- ルール: 数字でも、漢字でも、アルファベットでも、**「とにかく1文字」**あればOK。
例:
/あ.い/
- 「あいい」 … OK
- 「ああい」 … OK
- 「あ1い」 … OK
- 「あい」 … NG(文字が足りない)
2. * (アスタリスク)
→「0回以上のくり返し」
- イメージ: おかわり自由。「なくてもいいし、無限(むげん)にあってもいい」。
- ルール: 直前(ちょくぜん)の文字が「0個、1個、2個……」と、いくつ続いていてもOK。
例:
/あ*い/
- 「い」 … OK(「あ」が0個でもいい)
- 「あい」 … OK
- 「あああい」 … OK
3. + (プラス)
→「1回以上のくり返し」
- イメージ: 最低(さいてい)でも1つは必要。「1個以上なら、いくつでもいい」。
- ルール: 直前の文字が「1個、2個、3個……」と続いていればOK。
例:
/あ+い/
- 「い」 … NG(「あ」が最低1つは必要!)
- 「あい」 … OK
- 「あああい」 … OK
4. ? (クエスチョン)
→「0回か 1回だけ」
- イメージ: 「あってもなくてもいい(最大1つまで)」。
- ルール: 直前の文字が「ない」か「1個だけある」状態。
例:
/あ?い/
- 「い」 … OK
- 「あい」 … OK
- 「ああい」 … NG(2個以上はダメ)
5. ^(キャレット)
→「行がここから始まる」
- イメージ: マラソンの「スタートライン」です。
- ルール: その文字で文章が始まっていることをチェックします。
例:
/^おはよう/
- 「おはようございます」 … OK
- 「みんな、おはよう」 … NG(「みんな」から始まっているから)
6. $ (ドル)
→「行の最後がこれでおわる」
- イメージ: マラソンの「ゴールテープ」です。
- ルール: その文字で文章が終わっていることをチェックします。
例:
/です$/
- 「田中です」 … OK
- 「田中ですよ」 … NG(「よ」で終わっているから)
7. | (パイプ・縦線)
→「または(OR)」
- イメージ: レストランのメニュー。「A または B どちらか選んで」というルール。
- ルール: 左側か右側、どちらかの文字があればOK。
例:
/りんご|みかん/
- 「りんご」 … OK
- 「みかん」 … OK
- 「バナナ」 … NG
覚え方のまとめテーブル
| 記号 | 意味 | 覚え方のヒント |
|---|---|---|
. | なんでも1文字 | 何が入るかワクワクする「穴」 |
* | 0個以上 | おかわり自由(なくてもいい) |
+ | 1個以上 | 必ず1つは持ってきて! |
? | 0か1個 | オプション(あってもなくてもいい) |
^ | 始まり | 文の最初にあるスタートライン |
$ | 終わり | 文の最後にあるゴールテープ |
| | または | AかB、どちらか好きな方! |
いかがでしょうか? 記号の「パワー」を知ると、短いコードで複雑なチェックができるようになります。
IV. よく使う「魔法の記号」(2)
正規表現(RegExp)のメタ文字、さらに便利なものを紹介します! 今回は、文字を 「グループ化」 したり、「回数を正確に指定」 したりする、少し高度なルールです。
「チーム作り」 や 「回数の予約」 に例えて説明ます。
1. () (かっこ)
→「チーム(グループ)を作る」
- イメージ: 複数の文字をひとつにまとめて「1つのチーム」として扱います。
- ルール: チームに対して、さっき勉強した
*や+を使うことができます。
例:
/(abc)+/
- 「abc」 … OK
- 「abcabcabc」 … OK(「abc」というチームが繰り返されている)
- 「abcc」 … NG(チーム全員で繰り返さないとダメ)
2. [] (角かっこ)
→「この中のどれか1文字」
- イメージ: 「この中(リスト)にある文字なら、誰でもいいよ」という メンバー名簿 です。
- ルール: カッコの中に入っている文字のどれか1つに合えばOK。
例:
/[ABC]くん/
- 「Aくん」 … OK
- 「Bくん」 … OK
- 「Cくん」 … OK
- 「Dくん」 … NG(名簿に名前がない)
3. {n} {n,} {n, m} (波かっこ)
→「回数を数字で指定する」
これらは + や * よりも、もっと細かく 「何回か」 を予約する記号です。
{n} :ぴったり n回
- 例:
/\d{3}/(数字がぴったり3つ) - 「123」はOK、「12」はNG。
{n,} :n回以上(いくらでも)
- 例:
/\d{3,}/(数字が3つ以上) - 「123」も「12345」もOK。
{n, m} :n回から m回のあいだ
- 例:
/\d{3,5}/(数字が3つ、4つ、または5つ) - 「1234」はOK、「123456」はNG。
4. \ (バックスラッシュ / 円マーク)
→「魔法を消して、普通の文字に戻す」
- イメージ: 「エスケープ(逃がす)」 といいます。特別な力を持っているメタ文字から、魔法を取り上げます。
- ルール: メタ文字の前に書くと、ただの「記号」として探せるようになります。
例: 普通のドット(.)を探したいとき
.だけだと「なんでも1文字」という魔法が発動します。/\./と書くと、文章の中にある**「点(ドット)」**そのものを探せます。
まとめテーブル(留学生向け)
| 記号 | 意味 | 覚え方のヒント |
|---|---|---|
( ) | グループ化 | 「みんなで1つのチームだよ!」 |
[ ] | どれか1つ | 「このリストの中の誰か1人!」 |
{n} | ぴったり n回 | 「回数を予約(よやく)する」 |
{n, m} | n回〜m回 | 「最小と最大を決める」 |
\ | エスケープ | 「魔法をキャンセル!」 |
いかがでしょうか?これで正規表現の主要なパーツが揃いました。
留学生へのアドバイス
RegExpは、最初は難しくて「暗号」に見えます。でも、全部覚える必要はありません!
「RegExpは 『文字の形をチェックするルールブック』 だよ。 郵便番号、メールアドレス、パスワードの強さ(英数字が入っているか)を調べるときに、世界中のプログラマーが使っているんだ。 難しいパターンは、インターネットで『RegExp 郵便番号』のように検索してコピーすれば大丈夫だよ!」
Important
スラッシュ
/ /の後ろにつけるオプション(フラグ)
/abc/i:大文字と小文字を区別しない(ignore)。/abc/g:全部探す(global)。この2つを知ると、さらに便利に使ってもらえます。
いかがでしょうか?「完璧なパターンを自分で書く」ことよりも、「ルールで検索できる便利な道具がある」ことを知ることが第一歩です!
V. 実際に使ってみよう
よくある「メールアドレスの入力チェック」のようなイメージです。
const myPattern = /apple/; // 「apple」という文字があるか?
const text = "I have an apple.";
// testメソッド:パターンに合っているかチェック(true / false)
if (myPattern.test(text)) {
console.log("見つかりました!");
}
少し難しいパターン例
「数字が3つ連続しているところを探す」
const numPattern = /\d{3}/;
console.log(numPattern.test("abc123def")); // true
これまで学んだ「魔法の記号(メタ文字)」を組み合わせて、実際に使える 「郵便番号」 と 「電話番号」 のパターンを作ってみましょう!
パズルを組み立てるような感覚で見ていくと、楽しく覚えられます。
1. 「郵便番号」のパターン
日本の郵便番号は、「数字3つ + ハイフン + 数字4つ」 という形です。
正規表現: /^\d{3}-\d{4}$/
^: ここから始まる。\d{3}: 数字(digit)が 3つ ぴったり。-: ハイフンがある。\d{4}: 数字が 4つ ぴったり。$: ここで終わる。
これを使うと: 「123-4567」は OK ですが、「123-456」や「1234-567」は NG になります。
2. 「電話番号」のパターン
日本の電話番号は、場所によって桁数が違いますが、一般的には 「数字2〜4個 + ハイフン + 数字2〜4個 + ハイフン + 数字4個」 という形が多いです。
正規表現: /^\d{2,4}-\d{2,4}-\d{4}$/
^\d{2,4}: 最初の数字は 2つから4つの間。-: ハイフン。\d{2,4}: 真ん中の数字も 2つから4つの間。-: ハイフン。\d{4}$: 最後は必ず 4つ で終わる。
これを使うと: 「03-1234-5678」も「090-1234-5678」も OK になります。
3. もっと自由に!「ハイフンがあってもなくてもいい」場合
留学生が「ハイフンを書かない人」もいるかもしれない、と考えたときは ? の出番です。
正規表現: /^\d{3}-?\d{4}$/
-?: ハイフンが 「0回か1回」。つまり、「あってもなくてもいいよ!」という意味です。
4. 覚え方のコツ
「正規表現は、左から右へ順番に読んでいくんだよ。
^(入り口)から入って、\d(数字)の関所(せきしょ)をいくつか通って、最後は$(出口)にたどり着く。 途中でルールに合わない人が来たら、門前払い(もんぜんばらい)にするガードマンのようなものだよ!」
Tip
よく使う練習問題
/[0-9]/は\dと同じ意味です。[ ]を使うと、[0-9]{3}のように書くこともできます。これで、バリエーションが広がります。
まとめテーブル:今回使ったパーツ
| パーツ | 役割 | 郵便番号での仕事 |
|---|---|---|
^ | はじまり | 最初の文字からチェック! |
\d | 数字 | 「1, 2, 3…」を探す |
{n} | ぴったりn回 | 桁数を固定する |
- | そのままの文字 | ハイフンがあるか見る |
$ | おわり | 余計な文字がないかチェック! |
いかがでしょうか?これで「正しいデータだけを受け付ける」という、とても実践的(じっせんてき)なプログラムが作れるようになります。
VI. 実践的な例 その2
「正しいパスワードの形」をチェックするコードです。これまでの集大成として、とても良い練習になります!
「パスワードの門番」 を作るイメージで説明します。
1. パスワードのルール(仕様)
今回は、よくあるこのようなルールをチェックします。
- 長さ: 8文字から16文字の間
- 文字: 英小文字(a-z)、数字(0-9)、特定の記号(@#!)が使える
- 最初: 必ず英小文字から始まる
2. パスワードチェックのコード
// パスワードの正規(せいき)表現(ひょうげん)(せいきひょうげん)
// 意味:最初は小文字、そのあとは英数字(えいすうじ)か記号が7〜15回続く(合計8〜16文字)
const passPattern = /^[a-z][a-z0-9@#!]{7,15}$/;
function checkPassword(pass) {
if (passPattern.test(pass)) {
console.log("✅ OK! 「" + pass + "」は正しいパスワードです。");
} else {
console.log("❌ NG! 「" + pass + "」はルールに合っていません。");
}
}
// テストしてみましょう
checkPassword("mypass123"); // OK (英小文字から始まり、合計9文字)
checkPassword("a@#123456"); // OK (記号も使えます)
checkPassword("123password"); // NG (数字から始まっている)
checkPassword("abc"); // NG (短すぎる)
checkPassword("thisIsAVeryLongPassword"); // NG (長すぎる)
3. この「暗号」の読みとき方(解説)
左から順番に「門(もん)」を通過するイメージで考えてください。
^: ここからチェック開始![a-z]: 最初の1文字目は、**絶対に「英小文字」**じゃなきゃダメ。[a-z0-9@#!]: 2文字目からは、小文字・数字・記号のどれかを使ってね。{7,15}: 3番のルールを 7回から15回繰り返して ね。(最初の1文字を合わせると、全部で8〜16文字になります)$: ここで終わり。これより後ろに余計な文字があったらダメ!
これで、郵便番号、電話番号、そしてパスワードのバリデーション(入力チェック)ができるようになりましたね!