正規表現入門 — よく使うパターンと実践例
正規表現とは
正規表現(Regular Expression、略称: regex)は、文字列のパターンを記述するための特殊な記法です。テキストの検索、置換、バリデーションなど、文字列処理が必要なあらゆる場面で活用されます。
ほぼ全てのプログラミング言語が正規表現をサポートしており、一度習得すればJavaScript、Python、Java、PHP、Goなど、言語を問わず応用できます。
基本のメタ文字
正規表現は通常の文字とメタ文字(特殊な意味を持つ文字)の組み合わせで構成されます。まず、基本的なメタ文字を押さえましょう。
文字クラス
| メタ文字 | 意味 | 例 | マッチする文字列 |
|---|---|---|---|
. |
任意の1文字(改行以外) | a.c |
abc, a1c, a-c |
\d |
数字(0-9) | \d{3} |
123, 456 |
\D |
数字以外 | \D+ |
abc, --- |
\w |
英数字とアンダースコア | \w+ |
hello_123 |
\W |
\w 以外 |
\W |
@, #, |
\s |
空白文字 | \s+ |
, \t, \n |
\S |
空白以外 | \S+ |
hello |
アンカー
アンカーは文字そのものではなく、位置にマッチします。
| メタ文字 | 意味 | 例 | 説明 |
|---|---|---|---|
^ |
行頭 | ^Hello |
行頭の「Hello」にマッチ |
$ |
行末 | end$ |
行末の「end」にマッチ |
\b |
単語境界 | \bcat\b |
「cat」に一致、「catch」には不一致 |
文字セット
角括弧 [] で独自の文字クラスを定義できます。
[abc] # a, b, c のいずれか
[a-z] # 英小文字
[A-Za-z] # 英字(大小文字)
[0-9] # 数字(\d と同等)
[^0-9] # 数字以外(^ は否定)
[a-zA-Z0-9_] # 英数字とアンダースコア(\w と同等)
量指定子(Quantifiers)
量指定子は、直前の要素が何回繰り返されるかを指定します。
| 量指定子 | 意味 | 例 | マッチする文字列 |
|---|---|---|---|
* |
0回以上 | ab*c |
ac, abc, abbc |
+ |
1回以上 | ab+c |
abc, abbc |
? |
0回または1回 | colou?r |
color, colour |
{n} |
ちょうどn回 | \d{4} |
2026 |
{n,} |
n回以上 | \d{2,} |
12, 123, 1234 |
{n,m} |
n回以上m回以下 | \d{2,4} |
12, 123, 1234 |
貪欲マッチと最短マッチ
デフォルトでは量指定子は「貪欲(greedy)」で、可能な限り多くの文字にマッチします。末尾に ? を付けると「最短(lazy)」マッチに変わります。
# 入力: <div>hello</div>
<.*> # 貪欲: <div>hello</div> 全体にマッチ
<.*?> # 最短: <div> にマッチ
HTMLタグの抽出やクォートされた文字列の取得では、最短マッチが有用です。
グループ化とキャプチャ
丸括弧 () でパターンをグループ化し、マッチした部分をキャプチャ(抽出)できます。
基本的なグループ化
(abc)+ # 「abc」の1回以上の繰り返し
(red|blue) # 「red」または「blue」
キャプチャグループの活用
const pattern = /(\d{4})-(\d{2})-(\d{2})/;
const match = "2026-03-08".match(pattern);
console.log(match[1]); // "2026" (年)
console.log(match[2]); // "03" (月)
console.log(match[3]); // "08" (日)
名前付きキャプチャグループ
(?<name>...) の構文で、グループに名前を付けられます。可読性が大幅に向上します。
const pattern = /(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})/;
const match = "2026-03-08".match(pattern);
console.log(match.groups.year); // "2026"
console.log(match.groups.month); // "03"
console.log(match.groups.day); // "08"
非キャプチャグループ
マッチ結果を保存する必要がない場合、(?:...) を使うと非キャプチャグループになります。パフォーマンスの面でわずかに有利です。
(?:http|https):// # プロトコル部分をグループ化するが、キャプチャはしない
先読みと後読み(Lookahead / Lookbehind)
先読みと後読みは、パターンの前後にある文字列を条件として指定しますが、マッチ結果自体には含みません。
| 構文 | 名称 | 説明 |
|---|---|---|
(?=...) |
肯定先読み | 直後に指定パターンが続く位置 |
(?!...) |
否定先読み | 直後に指定パターンが続かない位置 |
(?<=...) |
肯定後読み | 直前に指定パターンがある位置 |
(?<!...) |
否定後読み | 直前に指定パターンがない位置 |
# 「円」が後に続く数値にマッチ(「円」自体はマッチに含まない)
\d+(?=円)
# 入力: "100円 200ドル 300円"
# マッチ: "100", "300"
# 「$」の後に続く数値にマッチ
(?<=\$)\d+
# 入力: "$100 200 $300"
# マッチ: "100", "300"
実践的なパターン例
メールアドレスの検証
^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$
このパターンは一般的なメールアドレスの形式を検証します。ただし、RFC 5321に完全に準拠した検証はより複雑になります。実務では、形式チェックは簡易的に行い、確認メールの送信で有効性を検証するアプローチが推奨されます。
電話番号(日本の形式)
^0\d{1,4}-?\d{1,4}-?\d{3,4}$
ハイフンあり・なしの両方に対応しています。より厳密にする場合は、市外局番のパターンを個別に定義する必要があります。
URLの検証
^https?:\/\/[a-zA-Z0-9]([a-zA-Z0-9-]*[a-zA-Z0-9])?(\.[a-zA-Z]{2,})+([\/\w.-]*)*\/?$
郵便番号(日本)
^\d{3}-?\d{4}$
「123-4567」と「1234567」の両方にマッチします。
パスワード強度チェック
8文字以上で、英大文字・英小文字・数字をそれぞれ1つ以上含むことを検証します。
^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)[a-zA-Z\d@$!%*?&]{8,}$
このパターンでは肯定先読みを3つ使い、各文字種の存在を個別にチェックしています。
正規表現のパフォーマンス
正規表現は強力ですが、記述によってはパフォーマンスの問題を引き起こすことがあります。
避けるべきパターン
- 破滅的バックトラッキング:
(a+)+bのようなネストした量指定子は、入力によっては指数的に処理時間が増加する - 不必要なキャプチャ: キャプチャ不要な箇所は
(?:...)を使う - 過度に複雑なパターン: 1つの正規表現で全てを処理しようとせず、複数のステップに分割する
推奨事項
- 正規表現の動作を可視化するツール(デバッガー)を活用する
- まずは単純なパターンから始め、段階的に条件を追加する
- 実際の入力データでテストし、エッジケースを網羅する
まとめ
正規表現はテキスト処理における万能ツールです。メタ文字、量指定子、グループ化、先読みの基本を押さえれば、多くの実務的な課題に対応できます。最初は複雑に感じるかもしれませんが、よく使うパターンから少しずつ覚えていけば、確実に習得できます。正規表現テスターを使って、パターンの動作をリアルタイムに確認しながら学習を進めるのが効率的です。
