正規表現テスターをJavaScriptで作った話|`.*\d+.*` が読めるようになる

正規表現テスターをJavaScriptで作った話|`.*\d+.*` が読めるようになる

こんな文字列を見たことはありませんか?

^([a-zA-Z0-9_.+-]+)@([a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+)$

「呪文?」と思うかもしれません。これは**正規表現(Regular Expression / Regex)**と呼ばれる、「文字列のパターンを表す記法」です。

メールアドレス・電話番号の検証、ログからのIPアドレス抽出、コードの一括置換——正規表現はエンジニアの仕事に欠かせません。この記事では、Lapis Tech Toolsの 正規表現テスター を題材に、正規表現の仕組みとJavaScriptでの実装を解説します。


1. 正規表現とは何か

正規表現は、文字列のパターンを表す「ミニ言語」です。プログラミング言語ではなく、ほぼすべての言語(JavaScript・Python・Java・Go)で共通して使える記法です。

なぜ必要なのか

// 正規表現なし:条件を全部書く
function isValidEmail(email) {
  return email.includes('@') &&
         email.includes('.') &&
         email.indexOf('@') > 0 &&
         email.lastIndexOf('.') > email.indexOf('@');
  // まだ足りない...
}

// 正規表現あり:1行で書ける
function isValidEmail(email) {
  return /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email);
}

複雑な文字列パターンの検証・抽出・置換を、少ないコードで正確に表現できます。


2. メタ文字:正規表現の「アルファベット」

正規表現はメタ文字(特殊な意味を持つ文字)の組み合わせで書きます。

文字の種類を指定する

メタ文字意味
.改行以外の任意の1文字a.cabc, axc
\d数字(0〜9)\d\d\d123, 456
\w英数字とアンダースコア\w+hello, user_1
\sスペース・タブ・改行\s+ → スペース区切り
[abc]aまたはbまたはc[aeiou] → 母音1文字
[a-z]aからzの範囲[A-Za-z] → 英字1文字
[^abc]a・b・c以外[^0-9] → 数字以外

繰り返し回数を指定する

メタ文字意味
*0回以上ab*cac, abc, abbc
+1回以上ab+cabc, abbcacはNG)
?0回または1回colou?rcolor, colour
{3}ちょうど3回\d{3}123
{2,4}2〜4回\d{2,4}12, 123, 1234

位置を指定する

メタ文字意味
^文字列の先頭^Hello → 「Hello」で始まる
$文字列の末尾world$ → 「world」で終わる

3. グループとキャプチャ

() で正規表現を囲むとグループになります。

// グループなし:一致するか確認するだけ
'2026-04-10'.match(/\d{4}-\d{2}-\d{2}/)
// → ['2026-04-10']

// グループあり:年・月・日を個別に取り出せる
'2026-04-10'.match(/(\d{4})-(\d{2})-(\d{2})/)
// → ['2026-04-10', '2026', '04', '10']
//                   ↑年     ↑月   ↑日

|(パイプ)はOR条件です:

/cat|dog/.test('I have a cat') // → true
/cat|dog/.test('I have a dog') // → true

4. フラグ:正規表現の「オプション」

正規表現の末尾に付ける文字で、マッチの挙動を変えます。

const regex = /hello/gi
//             ↑パターン ↑フラグ
フラグ意味
g全箇所マッチ(グローバル)デフォルトは最初の1件のみ
i大文字・小文字を区別しない/hello/iHello, HELLO
m複数行モード(^ $ が各行に適用)テキスト全体ではなく行ごとに判定

5. JavaScriptでの使い方

検証:test()

const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
emailRegex.test('user@example.com');  // → true
emailRegex.test('not-an-email');      // → false

抽出:match() / matchAll()

const text = 'IPアドレス: 192.168.1.1 と 10.0.0.1 が接続しています';
const ipRegex = /\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/g;

text.match(ipRegex);
// → ['192.168.1.1', '10.0.0.1']

置換:replace()

// ログのタイムスタンプを伏せ字に
const log = '2026-04-10 10:30:00 - ERROR: Connection failed';
log.replace(/\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}/, '[TIMESTAMP]');
// → '[TIMESTAMP] - ERROR: Connection failed'

6. リアルタイムハイライトの実装

正規表現テスターの核心は、入力と同時にマッチ箇所をハイライト表示する機能です。

仕組みの概要

入力テキスト + 正規表現

  match() でマッチ箇所を特定

  マッチ部分を <mark> タグで囲む

  innerHTML としてプレビューエリアに反映

コアロジック

function highlight(text, pattern, flags) {
  // 正規表現オブジェクトを動的に生成
  let regex;
  try {
    regex = new RegExp(pattern, flags);
  } catch (e) {
    // パターンが不正な正規表現の場合はそのまま表示
    return escapeHtml(text);
  }

  // マッチ箇所を <mark> タグで囲む
  return escapeHtml(text).replace(regex, match => `<mark>${match}</mark>`);
}

// XSS対策:HTMLの特殊文字をエスケープ
function escapeHtml(str) {
  return str
    .replace(/&/g, '&amp;')
    .replace(/</g, '&lt;')
    .replace(/>/g, '&gt;');
}

XSS(クロスサイトスクリプティング)とは? ユーザーが入力した文字列をそのまま innerHTML に設定すると、<script>alert('攻撃')</script> のようなHTML/JavaScriptが実行されてしまう脆弱性です。escapeHtml()< > & をエスケープすることで防ぎます。

マッチ件数のカウント

function countMatches(text, regex) {
  const matches = text.match(regex);
  return matches ? matches.length : 0;
}

gフラグ なしの場合は最大1件しかマッチしないため、カウントには g フラグが必須です。


7. よく使う正規表現パターン集

コピーしてすぐ使えるパターンです。正規表現テスターで動作確認できます。

// メールアドレス
/^[^\s@]+@[^\s@]+\.[^\s@]+$/

// 日本の電話番号(ハイフンあり)
/^0\d{1,4}-\d{1,4}-\d{4}$/

// 郵便番号
/^\d{3}-?\d{4}$/

// URLの抽出
/https?:\/\/[^\s]+/g

// IPアドレス(簡易版)
/\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b/g

// 日付(YYYY-MM-DD)
/\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01])/

// クレジットカード番号の伏せ字確認
/\b\d{4}[\s-]?\d{4}[\s-]?\d{4}[\s-]?\d{4}\b/

// 16進数カラーコード
/#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})\b/

8. まとめ

学んだこと内容
メタ文字. \d \w [a-z] で文字の種類を表現
量指定子* + ? {n,m} で繰り返し回数を指定
アンカー^ $ で位置(先頭・末尾)を指定
グループ() で部分マッチを取り出す
フラグg(全件)i(大小無視)m(複数行)
JS APItest() match() replace() new RegExp()
XSS対策innerHTML に出力する前に必ずエスケープ

正規表現はすべてを覚える必要はありません。「こんなパターンがあるんだ」と知っておき、必要なときに 正規表現テスターで試しながら組み立てるのが実務的なアプローチです。

→ 正規表現テスターを使ってみる


ツール解説シリーズ:第1回・IP計算機 | 第2回・Base64エンコーダー | 第3回・chmod計算機 | 第4回・JSONフォーマッター | 第5回・Cronジェネレーター | 今ここ(第6回・正規表現テスター) | 第7回・UUIDジェネレーター | 第8回・Markdownプレビュー

この記事をシェアする

関連記事


CHECK IT OUT

Members Only

サブスク加入者限定の コンテンツを配信中

  • 毎月のAI・自動化トレンドレポート
  • クリエイター向け業務効率化テンプレート
  • ツール選定・SaaS比較まとめ(限定公開)
Discord サーバー & LINE 公式の両方で通知します
クリエイター・個人事業主向け 受付中

「これ自動化できないかな?」 そのアイデア、ITで実現できます。

業務の自動化・お客様向けツール開発・AI活用まで、クリエイター・個人事業主専門のITコンサルタントが対応します。まずは気軽にご相談ください。

LINEで相談 フォームで相談