正規表現はどこで使う?検索・置換で覚える実務パターン入門
正規表現は、文字列の中から「特定の形」を探したり、まとめて置換したりするための書き方です。Web制作ならHTMLやログの確認、WordPress運用なら記事本文やCSVの整形、サーバー運用ならログ検索でよく使います。
最初に覚えるべきことは多くありません。正規表現は、文字そのものと、特別な意味を持つ記号を組み合わせて検索条件を書く道具です。
この記事では、初心者が実務でまず使う検索・置換パターンに絞って整理します。
- 文字列検索でよく使う
.、*、+、?、[]、^、$の意味 - WordPress本文、ログ、CSV、ファイル名の整理で使う例
- JavaScript、Python、grep での使い方の違い
- 置換で壊しやすいパターンと確認ポイント
前提環境:正規表現はツールごとに少し違う
正規表現の考え方は共通していますが、使える機能や書き方はツールによって差があります。
この記事では、次の環境を想定します。
- JavaScript: ブラウザまたは Node.js の
RegExpと文字列メソッド - Python: Python 3 系の標準ライブラリ
re - CLI: GNU grep 3 系相当の
grep - 用途: 検索、抽出、置換、簡単な入力チェック
MDN の JavaScript ガイドでは、正規表現は文字列内の文字の組み合わせを照合するパターンとして説明されています。Python の公式 HOWTO でも、re モジュールを使って文字列照合を行う前提で整理されています。つまり、どの環境でも中心は「文字列に対してパターンを当てる」ことです。
ただし、同じ \d や \w でも、Unicode の扱いやオプションによって結果が変わることがあります。実務では、Webフォーム、Pythonスクリプト、サーバー上の grep へそのままコピーする前に、対象ツールで小さく試すのが安全です。
ここがポイント: 正規表現は「一度覚えれば全環境で完全に同じ」ではなく、「基本形を覚えて、使うツールの差分を確認する」ものです。
基本の読み方:普通の文字と特殊文字を分けて考える
正規表現は、まず「そのまま探す文字」と「条件を表す記号」を分けると読みやすくなります。
たとえば次の文字列から error を探すだけなら、正規表現はただの文字列です。
2026-07-07 10:15:02 error: image not found
error
これは error という連続した文字を探します。難しくありません。
正規表現らしくなるのは、次のような「形」を探したいときです。
- 数字が続く部分を探したい
- 行頭が
#の行だけ見つけたい http://とhttps://の両方を拾いたい- 余分な空白をまとめて1つにしたい
- ファイル名の末尾が
.jpgまたは.pngのものを探したい
このときに特殊文字を使います。
よく使う特殊文字
まずは次の範囲で十分です。
| 書き方 | 意味 | 例 |
|---|---|---|
. |
任意の1文字 | a.c は abc や a-c に一致 |
* |
直前の文字が0回以上 | ab*c は ac、abc、abbc に一致 |
+ |
直前の文字が1回以上 | ab+c は abc、abbc に一致 |
? |
直前の文字が0回または1回 | https? は http と https に一致 |
[] |
どれか1文字 | [abc] は a、b、c のどれか |
[^] |
含まない1文字 | [^0-9] は数字以外 |
^ |
行頭または文字列先頭 | ^# は # で始まる行 |
$ |
行末または文字列末尾 | .png$ は末尾が .png の文字列 |
\d |
数字 | \d+ は数字の連続 |
\s |
空白文字 | \s+ は空白の連続 |
\w |
単語構成文字 | 英数字や _ など |
注意したいのは、* や + は単独で「何でも繰り返す」記号ではないことです。直前の要素を何回繰り返すかを指定します。
検索で使う基本パターン
ここからは、実務でそのまま試しやすい例に寄せます。
数字だけを探す
ログ、注文番号、記事ID、ファイル名の番号を探すときは \d+ がよく使われます。
\d+
入力例:
post-1287.html
image_20260707.png
user id: 42
一致する部分:
1287
20260707
42
\d は数字1文字、+ は1回以上の繰り返しです。つまり \d+ は「数字が1文字以上続く部分」を表します。
URLの http と https をまとめて探す
Web制作やWordPress移行では、本文中のURL確認がよくあります。
https?://
これは次の両方に一致します。
http://example.com
https://example.com
? は直前の s が「あってもなくてもよい」という意味です。http と https を別々に探すより、検索条件を1つにできます。
行頭のコメントや見出しを探す
Markdownや設定ファイルでは、行頭の記号が意味を持ちます。
^#
これは # で始まる行を探します。
# 見出し
本文です
## 小見出し
複数行テキストで ^ を各行の先頭として扱うか、文字列全体の先頭として扱うかはツールやオプションで変わります。JavaScript では m フラグを使うと、^ と $ が各行に対して働きます。
const text = "# 見出し\n本文\n## 小見出し";
const headings = text.match(/^#+\s.+$/gm);
console.log(headings);
出力例:
["# 見出し", "## 小見出し"]
g は全件検索、m は複数行モードです。
置換で使う基本パターン
正規表現が実務で便利なのは、検索よりも置換で使う場面です。余分な空白、表記ゆれ、HTMLの一部などをまとめて整えられます。
連続する空白を1つにする
コピーした文章やCSVの前処理では、空白が何個も続くことがあります。
JavaScript の例:
const text = "商品A 1200円\n商品B\t980円";
const normalized = text.replace(/\s+/g, " ");
console.log(normalized);
出力例:
商品A 1200円 商品B 980円
\s+ は空白文字の連続です。スペースだけでなく、タブや改行にも一致します。改行を残したい場合は、いきなり \s+ で置換せず、スペースとタブだけを対象にするなど範囲を絞ります。
[ \t]+
このように書くと、半角スペースとタブの連続だけを対象にできます。
日付の区切りをそろえる
ログやファイル名で、日付の区切りが / と - で混ざることがあります。
Python の例:
import re
text = "2026/07/07 report, 2026/07/08 backup"
result = re.sub(r"(\d{4})/(\d{2})/(\d{2})", r"\1-\2-\3", text)
print(result)
出力例:
2026-07-07 report, 2026-07-08 backup
ここで使っている () はグループです。(\d{4}) は4桁の数字、(\d{2}) は2桁の数字を覚えておき、置換側の \1、\2、\3 で再利用しています。
この形は、CSVの列整形やファイル名の一括変更前の確認にも使えます。ただし、本当にファイル名を変更する処理では、最初に表示だけで確認してから実行するのが安全です。
HTMLタグを雑に削除しない
初心者がやりがちな失敗に、HTMLを正規表現だけで処理しようとする例があります。
NG例:
<.*>
このパターンは、< から > までを大きく取りすぎることがあります。
入力例:
<p>本文</p><p>次の本文</p>
<.*> は最初の <p> から最後の </p> まで広く一致する可能性があります。タグだけを消したつもりでも、中の本文まで巻き込む危険があります。
改善例として、単純なタグだけを対象にするなら次のように範囲を狭めます。
<[^>]+>
ただし、HTMLの構造を正確に扱う必要がある場合は、正規表現ではなくHTMLパーサーを使うべきです。WordPress本文の整形でも、ブロックHTMLや属性を含む本文を処理するなら、置換前にバックアップを取り、小さな範囲で検証します。
JavaScript、Python、grepでの使い分け
正規表現は、どこで実行するかによって向き不向きがあります。
| 使う場所 | 向いている作業 | 注意点 |
|---|---|---|
| JavaScript | フォーム入力チェック、ブラウザ上の文字列処理、Node.jsでの整形 | 置換や複数行検索ではフラグの指定を確認する |
| Python | CSV、ログ、Markdown、ファイル一覧の一括処理 | 文字列リテラルでは raw string の `r”…”` を使うと読みやすい |
| grep | サーバー上のログ検索、設定ファイルの確認 | 基本正規表現と拡張正規表現で書き方が変わる |
JavaScriptはフォームやフロント側の確認に向く
メールアドレスの厳密な判定を正規表現だけで完璧に行うのは難しいですが、「空欄ではない」「数字だけ」「指定の接頭辞で始まる」といった軽い確認には向いています。
const value = "post-1287";
console.log(/^post-\d+$/.test(value));
出力例:
true
^ と $ を付けることで、文字列全体が post-数字 の形かどうかを確認できます。これを付けないと、xxxpost-1287yyy のような文字列にも部分一致することがあります。
Pythonは一括整形に向く
Pythonでは re.findall() で抽出、re.sub() で置換できます。
import re
log = "error 500 /wp-admin, warn 301 /old-page, error 404 /missing"
errors = re.findall(r"error\s+\d+\s+\S+", log)
print(errors)
出力例:
['error 500 /wp-admin', 'error 404 /missing']
\S+ は空白以外の連続です。URLパスやファイル名のように、空白で区切られた値を拾うときに使いやすい書き方です。
grepはサーバー上で素早く探すのに向く
サーバーでログを見るときは、grep が便利です。
grep -E "error|warning" app.log
-E は拡張正規表現を使う指定です。error|warning は error または warning の行を探します。
ファイル名やディレクトリをまたいで探す場合は、対象範囲を絞ります。
grep -R -n -E "wp-login|xmlrpc" /var/log/nginx
-R は再帰検索、-n は行番号表示です。大きなディレクトリ全体に対して雑に実行すると時間がかかるため、ログの場所や拡張子を絞ると扱いやすくなります。
よくある失敗と直し方
正規表現の失敗は、たいてい「広く取りすぎる」「特殊文字を普通の文字として扱っていない」「全体一致と部分一致を混同する」のどれかです。
失敗1: ドットをそのまま使ってしまう
.jpg を探したいときに、次のように書くと危険です。
.jpg
. は任意の1文字なので、xjpg のような文字列にも一致します。拡張子のドットを探したいなら、バックスラッシュでエスケープします。
\.jpg
.jpg と .jpeg の両方を探すなら、次のように書けます。
\.jpe?g$
e? によって、e があってもなくても一致します。末尾だけを対象にしたいので $ も付けています。
失敗2: 全体一致のつもりが部分一致になる
数字だけの入力か確認したいとき、次の正規表現だけでは不十分です。
\d+
これは「数字が含まれているか」を見ます。abc123xyz にも一致します。
数字だけの文字列に限定するなら、先頭と末尾を指定します。
^\d+$
入力チェックでは、この ^ と $ の有無が結果を大きく変えます。
失敗3: 欲張りすぎる .* を使う
.* は便利ですが、広く一致しすぎます。
".*"
入力が次のような場合、最初の " から最後の " まで一致することがあります。
"one" and "two"
短く区切りたいなら、対象外の文字を指定します。
"[^"]*"
これは " 以外の文字が続く範囲に限定します。実務では「何でも」よりも「何ではないか」を書いたほうが壊れにくい場面があります。
実務で使う前のチェックリスト
正規表現は強力ですが、置換対象が広いほど事故も大きくなります。特にWordPress本文、CSV、ログ、設定ファイルを扱う前には、次の順で確認します。
- まず検索だけで一致範囲を見る
- 置換前と置換後のサンプルを数件確認する
.、*、+、?を普通の文字として使っていないか見る- 全体一致が必要なら
^と$を付ける - 改行をまたぐ可能性があるか確認する
- ツールの正規表現モードやフラグを確認する
- 本文や設定ファイルを直接置換する前にバックアップを取る
個人情報、認証情報、APIキーを含むログやCSVでは、サンプルを外部サービスに貼り付けないことも重要です。検証に使う場合は、値を伏せるか、ローカル環境で確認します。
代替手段:正規表現を使わないほうがよい場面
正規表現は万能ではありません。文字列の「形」が単純なときに強く、構造を理解する必要があるデータには向かないことがあります。
使い分けの目安は次の通りです。
- HTML全体を解析する: HTMLパーサーを使う
- JSONを読む: JSONパーサーを使う
- CSVを列として扱う: CSVライブラリを使う
- 単純な固定文字の置換: 通常の文字列置換で十分
- ログから決まった形だけ拾う: 正規表現が向いている
たとえば、JSONから値を取り出すために正規表現を書くより、JavaScriptなら JSON.parse()、Pythonなら json モジュールを使うほうが安全です。引用符やエスケープ、入れ子構造を正規表現で処理しようとすると、例外ケースが増えます。
まず覚えるならこの5パターン
最初から高度な機能を覚える必要はありません。実務で使い始めるなら、次の5つを手元のメモに置いておくと十分役立ちます。
\d+
数字の連続を探す。
\s+
空白の連続を探す。置換で使うときは改行まで巻き込むか確認する。
^keyword
行頭または文字列先頭の keyword を探す。
\.png$
末尾が .png の文字列を探す。
https?://
http:// と https:// の両方を探す。
正規表現で一番大事なのは、長い式を暗記することではありません。小さいパターンで一致範囲を確認し、必要な分だけ広げることです。次に試すなら、普段扱っているログ、Markdown、CSV、WordPress本文のコピーを使い、検索だけで「どこに一致するか」を見るところから始めるのが安全です。
