目次
正規表現とは
正規表現(Regular Expression)の定義
正規表現(せいきひょうげん、Regular Expression)は、文字列のパターンを表現するための記法です。「regex」や「regexp」と略されることもあります。特定のパターンに一致する文字列を検索したり、置換したり、バリデーション(検証)したりするために使われます。
例えば、「3桁の数字」というパターンを表現したい場合、正規表現では\d{3}と書きます。これにより、「123」「456」「999」などの3桁の数字に一致します。
正規表現の活用シーン
正規表現は、以下のような様々な場面で活用されます:
- フォーム入力のバリデーション:メールアドレス、電話番号、郵便番号などの形式チェック
- テキスト検索・置換:エディタやIDEでの高度な検索・一括置換
- ログファイル解析:特定のエラーメッセージやIPアドレスの抽出
- データ抽出・スクレイピング:HTMLやCSVからの特定パターンのデータ抽出
- ファイル操作:特定パターンに一致するファイル名の一括変更
- Web開発:URLルーティング、パラメータの解析、セキュリティチェック
正規表現を学ぶメリット
正規表現を習得すると、手作業で何時間もかかるテキスト処理が数秒で完了します。例えば、1万行のCSVファイルから電話番号だけを抽出したり、数千個のファイル名を一定のルールで変更したりといった作業が、正規表現を使えば一瞬で完了します。
また、正規表現はほぼすべてのプログラミング言語でサポートされているため、一度覚えれば様々な環境で使い回せる汎用的なスキルです。
当サイトの無料正規表現テスターを使えば、正規表現パターンをリアルタイムで試せます。マッチング結果がハイライト表示されるため、学習に最適です。
基本的なメタ文字
メタ文字とは、正規表現の中で特別な意味を持つ文字です。通常の文字として扱いたい場合は、バックスラッシュ\でエスケープします。
任意の文字・位置を表すメタ文字
| メタ文字 | 意味 | 例 |
|---|---|---|
| . | 任意の1文字(改行以外) | a.c → abc, a1c, aXc |
| ^ | 行の先頭 | ^Hello → 行頭のHello |
| $ | 行の末尾 | world$ → 行末のworld |
| \ | エスケープ(メタ文字を通常文字として扱う) | \. → ピリオド自体 |
論理演算を表すメタ文字
| メタ文字 | 意味 | 例 |
|---|---|---|
| | | OR(どちらか一方) | cat|dog → catまたはdog |
| () | グループ化・キャプチャ | (abc)+ → abc, abcabc |
実践で試す:正規表現テスターで、「a.c」というパターンを入力し、「abc」「a1c」「aXc」などのテキストを試してみましょう。リアルタイムでマッチング結果が確認できます。
量指定子(繰り返し)
量指定子は、直前のパターンが何回繰り返されるかを指定します。「1文字以上の数字」や「0回または1回のオプション文字」などを表現できます。
| 量指定子 | 意味 | 例 |
|---|---|---|
| * | 0回以上の繰り返し | ab*c → ac, abc, abbc |
| + | 1回以上の繰り返し | ab+c → abc, abbc(acは不一致) |
| ? | 0回または1回(オプション) | colou?r → color, colour |
| {n} | ちょうどn回 | \d{3} → 123, 456(3桁の数字) |
| {n,} | n回以上 | \d{2,} → 12, 123, 1234 |
| {n,m} | n回以上m回以下 | \d{2,4} → 12, 123, 1234 |
貪欲マッチングと非貪欲マッチング
量指定子はデフォルトで貪欲マッチング(Greedy)を行います。これは、できるだけ長くマッチするように動作します。例えば、<.*>というパターンで「<div>Hello</div>」を検索すると、全体がマッチします。
非貪欲マッチング(Lazy)を使うには、量指定子の後ろに?を付けます。例:<.*?>。これにより、最小限の文字数でマッチします(「<div>」と「</div>」が個別にマッチ)。
注意:貪欲マッチングは意図しない長いマッチを引き起こすことがあります。特にHTMLタグの抽出などでは、非貪欲マッチング(.*?)を使うのが一般的です。
文字クラス
文字クラスは、特定の文字セット(範囲)にマッチするパターンです。角括弧[]で囲んで表現します。
基本的な文字クラス
| 文字クラス | 意味 | 例 |
|---|---|---|
| [abc] | a、b、cのいずれか1文字 | gr[ae]y → gray, grey |
| [a-z] | 小文字アルファベット(a〜z) | [a-z]+ → hello, world |
| [A-Z] | 大文字アルファベット(A〜Z) | [A-Z]+ → HELLO, WORLD |
| [0-9] | 数字(0〜9) | [0-9]+ → 123, 456 |
| [^abc] | a、b、c以外の1文字(否定) | [^0-9] → 数字以外 |
定義済み文字クラス(ショートハンド)
| ショートハンド | 意味 | 同等の表現 |
|---|---|---|
| \d | 数字 | [0-9] |
| \D | 数字以外 | [^0-9] |
| \w | 単語文字(英数字とアンダースコア) | [A-Za-z0-9_] |
| \W | 単語文字以外 | [^A-Za-z0-9_] |
| \s | 空白文字(スペース、タブ、改行など) | [ \t\n\r\f\v] |
| \S | 空白文字以外 | [^ \t\n\r\f\v] |
正規表現テスターで、「\d{3}-\d{4}-\d{4}」というパターンを試してみましょう。これは「090-1234-5678」のような日本の携帯電話番号にマッチします。
チートシート(一覧表)
よく使う正規表現パターンをまとめた一覧表です。印刷して手元に置いておくと便利です。
基本パターン総まとめ
| カテゴリ | パターン | 意味 |
|---|---|---|
| 位置 | ^ | 行頭 |
| $ | 行末 | |
| \b | 単語境界 | |
| \B | 単語境界以外 | |
| 文字クラス | \d | 数字 [0-9] |
| \D | 数字以外 | |
| \w | 単語文字 [A-Za-z0-9_] | |
| \W | 単語文字以外 | |
| \s | 空白文字 | |
| \S | 空白文字以外 | |
| 量指定子 | * | 0回以上 |
| + | 1回以上 | |
| ? | 0回または1回 | |
| {n} | ちょうどn回 | |
| {n,} | n回以上 | |
| {n,m} | n回以上m回以下 | |
| グループ | () | キャプチャグループ |
| (?:) | 非キャプチャグループ | |
| | | OR(選択) |
実践例(メール・電話番号・URL)
実際の開発でよく使われる正規表現パターンを紹介します。これらのパターンは、フォームバリデーションやデータ抽出に役立ちます。
1. メールアドレス
基本的なパターン:
^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$マッチ例:
- user@example.com
- john.doe+filter@company.co.jp
- admin_2024@test-domain.org
2. 電話番号(日本)
携帯電話:
^0[789]0-\d{4}-\d{4}$固定電話(東京03など):
^0\d{1,4}-\d{1,4}-\d{4}$マッチ例:
- 090-1234-5678(携帯)
- 03-1234-5678(東京)
- 06-1234-5678(大阪)
3. URL(Webアドレス)
HTTP/HTTPSのURL:
^https?://[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}(/.*)?$マッチ例:
- https://example.com
- http://www.test.co.jp/path/to/page
- https://api.example.com/v1/users
4. 郵便番号(日本)
ハイフン付き/なし両対応:
^\d{3}-?\d{4}$マッチ例:
- 123-4567
- 1234567
5. 日付(YYYY-MM-DD形式)
ISO 8601形式:
^\d{4}-\d{2}-\d{2}$マッチ例:
- 2025-10-12
- 1990-01-01
実践で試す:正規表現テスターで、上記のパターンをコピーして実際のテキストに対して試してみましょう。マッチング結果がリアルタイムで確認できます。
よくある質問(FAQ)
- Q1.正規表現は難しそうですが、初心者でも使えますか?
- 最初は難しく感じるかもしれませんが、基本的なパターン(メタ文字や量指定子)を覚えれば、多くの実用的なケースに対応できます。本記事のチートシートを参考にしながら、実際に手を動かして試してみることが上達の近道です。当サイトの正規表現テスターを使えば、リアルタイムでマッチング結果を確認できるので、学習に最適です。
- Q2.正規表現を学ぶメリットは何ですか?
- 正規表現を習得すると、テキスト処理が劇的に効率化します。例えば、数千行のログファイルから特定のエラーメッセージを抽出したり、フォーム入力のバリデーションを実装したり、大量のファイル名を一括変更したりできます。プログラミング、データ分析、Web開発、システム管理など、あらゆる分野で役立つスキルです。
- Q3.正規表現はどのプログラミング言語で使えますか?
- ほぼすべての主要なプログラミング言語で正規表現がサポートされています。JavaScript、Python、PHP、Ruby、Java、C#、Go、Rustなど、言語によって細かい機能差はありますが、基本的なパターン(本記事で紹介するメタ文字や量指定子)はどの言語でも共通です。一度覚えれば、他の言語でもすぐに応用できます。
- Q4.正規表現のパフォーマンスは大丈夫ですか?
- 正規表現は強力ですが、複雑なパターンや「.*」のような貪欲なマッチングを多用すると、パフォーマンスが低下する可能性があります(特に巨大なテキストに対して実行する場合)。シンプルなパターンを心がけ、必要に応じて非貪欲マッチング(.*?)を使う、不要なキャプチャグループを避ける((?:...)を使う)などの最適化を行いましょう。
- Q5.正規表現でできないことはありますか?
- 正規表現は「正規言語」と呼ばれる範囲のパターンマッチングに適していますが、ネストした構造(HTMLの正しいタグ対応など)や文脈依存の解析には不向きです。例えば、完全なHTMLパーサーやプログラミング言語のパーサーを正規表現だけで実装するのは困難です。そのような場合は、専用のパーサーライブラリを使用することが推奨されます。
まとめ
正規表現は、最初は難しく感じるかもしれませんが、基本的なメタ文字、量指定子、文字クラスを覚えれば、多くの実用的なパターンマッチングが可能になります。本記事で紹介したチートシートを参考にしながら、当サイトの無料正規表現テスターで実際に試してみましょう。
本記事のポイント:
- 正規表現とは:文字列のパターンを表現する記法。検索、置換、バリデーションに使用
- メタ文字:.(任意の1文字)、^(行頭)、$(行末)、|(OR)など
- 量指定子:*(0回以上)、+(1回以上)、?(0回または1回)、{n,m}(n回以上m回以下)
- 文字クラス:[0-9]、[a-z]、\d(数字)、\w(単語文字)、\s(空白文字)など
- 実践例:メールアドレス、電話番号、URL、郵便番号、日付のバリデーションパターン
今すぐ正規表現を試してみましょう
無料で正規表現テスト →