正規表現
文字列のパターンを記号で表し、検索・抽出・置換を行うための小さな言語。メールやログの照合などに広く使われます。
- 1.正規表現はテキストのパターンを記述する記法で、検索・抽出・置換に使えます。
- 2.`.` や `*`、`\d` などのメタ文字を組み合わせて柔軟な照合を表現します。
- 3.貪欲マッチや記号のエスケープ忘れが典型的な落とし穴で、意図とずれた結果を招きます。
正規表現とは
正規表現(regex)は、「数字3桁+ハイフン+数字4桁」のような文字列のパターンを、短い記号列で表す記法です。テキストの中からパターンに合う箇所を検索・抽出・置換でき、ほとんどのプログラミング言語やエディタで使えます。
- 検索 — ログから IP アドレスらしい行を探す。
- 抽出 — 文章からメールアドレスや日付を取り出す。
- 置換 — 全角スペースを半角に、特定パターンを一括で書き換える。
ベタ書きの文字列一致と違い、「こういう形」というゆらぎを含む条件を1行で表せるのが強みです。
基本のメタ文字
通常の文字はそのまま一致しますが、特別な意味を持つ記号をメタ文字と呼びます。代表的なものを覚えると一気に読めるようになります。
| 記号 | 意味 | 例 |
|---|---|---|
. | 任意の1文字 | a.c は abc・a7c に一致 |
* | 直前の0回以上の繰り返し | ab* は a・abbb に一致 |
+ | 直前の1回以上の繰り返し | ab+ は ab・abbb に一致 |
? | 直前が0回か1回(省略可) | colou?r は color・colour |
\d | 数字1文字 | \d\d\d は3桁の数字 |
[ ] | 文字クラス(いずれか1文字) | [aeiou] は母音1つ |
^ $ | 行頭・行末 | ^abc$ は行全体が abc |
たとえば郵便番号「123-4567」は \d{3}-\d{4} と書けます。{3} は「ちょうど3回」を表す量指定子です。
const zip = /\d{3}-\d{4}/;
zip.test("123-4567"); // true
"郵便番号は 100-0001 です".match(/\d{3}-\d{4}/)[0]; // "100-0001"
抽出と置換
グループ化 ( ) を使うと、一致した一部分を取り出して再利用できます。置換では、取り出した部分を $1 のような番号で参照できます。
// 「年-月-日」を「日/月/年」に並べ替える
const s = "2026-06-06";
s.replace(/(\d{4})-(\d{2})-(\d{2})/, "$3/$2/$1"); // "06/06/2026"
( )でくくった部分は左から$1,$2, … と番号が振られます。- 置換は「検索パターン」と「置換後の文字列」の2つを与えるのが基本形です。
貪欲マッチの罠
* や + は既定でできるだけ長く一致しようとします。これを貪欲(greedy)マッチと呼び、意図せず広い範囲を飲み込むことがあります。
<.*> を <b>太字</b> に当てると、最初の < から最後の > まで一気に一致し、<b>太字</b> 全体を飲み込みます。タグ1個だけ取りたいなら、*? のように ? を付けた控えめ(lazy)マッチ <.*?> を使い、最短で止めます。
"<b>太字</b>".match(/<.*>/)[0]; // "<b>太字</b>"(貪欲:全部)
"<b>太字</b>".match(/<.*?>/)[0]; // "<b>"(控えめ:最短)
エスケープの落とし穴
. や (、?、\ などはメタ文字なので、文字そのものとして照合したいときはエスケープ(前に \ を付ける)が必要です。忘れると別の意味に解釈されます。
- 「ドットそのもの」を表すには
\.と書きます。.のままだと「任意の1文字」になります。 - たとえば
example.comを厳密に一致させたいならexample\.com。example.comのままだとexamplexcomなどにも一致します。
/example.com/.test("examplexcom"); // true(. が任意の1文字に化けている)
/example\.com/.test("examplexcom"); // false(ドットを文字として扱う)
いきなり記号を並べず、「数字が3つ、ハイフン、数字が4つ」と日本語で条件を声に出してから記号へ翻訳すると、過不足に気づけます。完成後は想定外の文字列(空文字や極端に長い入力)でもテストしましょう。
まとめ
正規表現は、テキストのパターンを記号で表し、検索・抽出・置換を1行で行える便利な道具です。. * \d [ ] などのメタ文字を組み合わせるのが基本で、グループ ( ) を使えば一部の取り出しや置換もできます。実務でつまずきやすいのは、広く飲み込む貪欲マッチと、記号のエスケープ忘れ。この2点に注意すれば、最初の壁は越えられます。
プログラミング Article
正規表現を実務で読む
TL;DRは入口です。実際に選ぶ・使う段階では、何を解決するか、何と比較するか、導入後にどこで詰まるかまで見る必要があります。
解決すること
正規表現
比較で見る軸
難易度: basic / カテゴリ: プログラミング / タグ数: 3
導入後に効く点
`.` や `*`、`\d` などのメタ文字を組み合わせて柔軟な照合を表現します。
先に潰すリスク
用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。
- 難易度
- basic
- カテゴリ
- プログラミング
- タグ数
- 3
判断チェックリスト
- 自社の用途が「正規表現 / 文字列処理」に近いか確認する。
- 強みである「正規表現はテキストのパターンを記述する記法で、検索・抽出・置換に使えます。」が本当に評価軸になるか確認する。
- 注意点の「用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。」を運用で吸収できるか確認する。
- 公開値や仕様値は、対象プラン・対象機種・対象リージョンまで確認する。
- 既存システム、ID、ネットワーク、監視、バックアップとの接続方法を先に洗い出す。
- 小さく試してから、本番移行、権限設計、障害時手順、コスト監視を決める。