1そもそも「正規表現」って何?
「正規表現(せいきひょうげん)」と聞くと、プログラマー向けの難しい技術に聞こえるかもしれません。しかし、実はEC業務でCSVを扱う人にとって非常に身近で強力な道具です。
ひとことで言えば、正規表現とは「文字列のパターンを指定して、検索・置換する仕組み」です。
たとえば、Excelの「検索と置換」では「りんご」を「リンゴ」に置き換えることはできます。しかし、「数字3桁+ハイフン+数字4桁のパターン(郵便番号)をすべて見つけたい」といった条件付き検索は、通常の検索機能ではできません。
正規表現を使えば、\d{3}-\d{4} と書くだけで、「100-0001」「530-0011」「980-0804」のような郵便番号のパターンを一括で見つけることができます。
正規表現をひとことで言うと
- 正規表現 = 「文字列のパターン」を記号で表現するルール
- 「特定の形式に一致するデータ」を一括で検索・置換できる
- テキストエディタ(VS Code、サクラエディタなど)やExcel VBA、GAS、Pythonで使える
- 強力だが、書き方を間違えると意図しないデータまで巻き込む危険性がある
テキストエディタの「正規表現で検索」にチェックを入れたことがある方もいるかもしれません。あれがまさに正規表現の入口です。
2EC業務でよく使う正規表現パターン
まずは、EC業務の現場で実際によく使われる正規表現パターンを見てみましょう。「こういうことができるんだ」というイメージを掴んでいただければ十分です。
JANコード(バーコード)のチェック
JANコードは13桁の数字です。CSVに不正なJANコードが混入していないか一括チェックするには:
^\d{13}$
これは「行の先頭(^)から数字(\d)が13個({13})並んで行末($)」という意味です。12桁や14桁のデータ、文字が混入したデータを一発で見つけられます。
電話番号のパターンマッチ
電話番号は「090-1234-5678」「03-1234-5678」「0120-123-456」など、桁数がバラバラです。ざっくり「電話番号らしいもの」を検索するなら:
0\d{1,4}-\d{1,4}-\d{3,4}
「0で始まり、数字が1〜4桁、ハイフン、数字が1〜4桁、ハイフン、数字が3〜4桁」というパターンです。
郵便番号の検索
\d{3}-\d{4}
「数字3桁 + ハイフン + 数字4桁」。シンプルですが、CSVの中から郵便番号のフォーマット違反を見つけるには十分です。
メールアドレスの簡易チェック
[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}
メールアドレスの厳密な検証は非常に複雑ですが、「明らかにメールアドレスではないデータ」を見つけるにはこの程度で十分です。
全角数字の検出
[0-9]+
CSVの中に全角数字が紛れ込んでいないかチェックするパターンです。在庫数や価格に全角数字が入っていると、システム取り込み時にエラーになることがあります。
| 用途 | 正規表現 | マッチする例 |
|---|---|---|
| JANコード | ^\d{13}$ |
4901234567890 |
| 郵便番号 | \d{3}-\d{4} |
100-0001 |
| 電話番号 | 0\d{1,4}-\d{1,4}-\d{3,4} |
03-1234-5678 |
| 全角数字 | [0-9]+ |
123 |
| 空白行 | ^\s*$ |
(空行やスペースだけの行) |
3正規表現でハマる「あるある」パターン
正規表現は強力ですが、書き方を少し間違えるだけで、意図しない結果になることが頻繁にあります。ここからが「沼」の本番です。
あるある1:貪欲マッチの罠
正規表現の.*(任意の文字の0回以上の繰り返し)は、デフォルトで「できるだけ長くマッチしようとする」性質があります。これを「貪欲(greedy)マッチ」と呼びます。
たとえば、HTMLタグの中身を取り出したいとき:
<b>.*</b>
入力データ:<b>商品A</b>と<b>商品B</b>
「商品A」と「商品B」を個別に取得
「商品A</b>と<b>商品B」が1つのマッチに
.*が「できるだけ長く」マッチしようとするため、最初の<b>から最後の</b>までの全体が1つのマッチになってしまいます。正しくは<b>.*?</b>と「?」を付けて非貪欲(lazy)マッチにする必要があります。
あるある2:エスケープ忘れ
正規表現では、.(ドット)は「任意の1文字」を意味します。つまり、「ドットそのもの」を検索したいのに、何にでもマッチしてしまうという事故が起きます。
たとえば、ファイル名の拡張子.csvを検索するとき:
.csv ← 間違い(「Acsv」「1csv」など何でもマッチ)\.csv ← 正解(ドットの前に\を付けてエスケープ)
同様に、( ) [ ] + * ? { } なども正規表現の特殊文字です。これらを「文字そのもの」として検索したい場合は、すべて\でエスケープが必要です。
エスケープが必要な主な文字
.―― 任意の1文字(ドットを検索したいなら\.)*―― 直前の文字の0回以上の繰り返し+―― 直前の文字の1回以上の繰り返し?―― 直前の文字の0回または1回( )―― グループ化[ ]―― 文字クラス{ }―― 繰り返し回数の指定^―― 行の先頭(文字クラス内では否定)$―― 行の末尾
あるある3:全角半角の罠
EC業務のデータには、全角と半角が混在しているケースが非常に多いです。「0120-123-456」(半角)と「0120−123−456」(全角)は、見た目は似ていても正規表現ではまったく別物です。
半角数字を検索する\dは、環境によっては全角数字にマッチしないことがあります。「全角数字も含めて検索したい」場合は、明示的に[\d0-9]と書く必要があります。
特に厄介なのが全角ハイフン。半角の「-」、全角の「−」(マイナス)、「ー」(長音)、「―」(ダッシュ)、「-」(全角ハイフン)。見た目はほぼ同じなのに、すべて別の文字です。電話番号の検索で「ハイフン入りの番号だけ抽出」しようとして、全角ハイフンの番号が漏れる――というのはよくある事故です。
あるある4:改行をまたぐマッチの失敗
正規表現の.は、デフォルトでは改行文字にマッチしません。商品説明文のように複数行にわたるテキストを処理しようとすると、1行目の途中でマッチが止まってしまいます。
対処法はツールによって異なりますが、多くの場合[\s\S](すべての文字)を使うか、「DOTALLモード」「sフラグ」を有効にする必要があります。これを知らないと「なぜか商品説明文だけ正規表現が効かない」という現象に悩まされます。
4商品データの一括修正で起きる事故
正規表現の怖さが本領を発揮するのは、「検索」ではなく「置換」のときです。検索は「見つけるだけ」ですが、置換はデータを実際に書き換えます。間違えたらデータが壊れます。
事故1:置換ミスで全データ破壊
商品名の末尾にある「【送料無料】」を一括削除しようとして:
検索:【.*】
置換:(空欄)
この正規表現は「【」から「】」までのすべてをマッチさせます。.*は貪欲マッチなので、「【新商品】オーガニックタオル【送料無料】」のような商品名では、「【新商品】オーガニックタオル【送料無料】」全体がマッチして商品名ごと消えてしまいます。
【新商品】オーガニックタオル【送料無料】
(空っぽ......)
正しくは【送料無料】と固定文字列で検索するか、非貪欲マッチ【.*?】を使って1つずつ確認しながら置換する必要があります。
事故2:意図しないマッチ
価格データから「円」を削除しようとして:
検索:円
置換:(空欄)
一見問題なさそうですが、商品説明に「円形テーブル」「円満な」「一万円札」などの文字列があると、「形テーブル」「満な」「一万札」に書き換わってしまいます。
正しくは\d+円$(数字の直後の行末の「円」のみ)のように、マッチ範囲を厳密に限定する必要があります。
事故3:部分一致の罠
SKUコードの「ABC」を「XYZ」に一括置換しようとしたら:
- 「ABC-001」 → 「XYZ-001」 (OK)
- 「ABC-002」 → 「XYZ-002」 (OK)
- 「ZABC-100」 → 「ZXYZ-100」 (意図しない置換!)
- 「ABCDE-050」 → 「XYZDE-050」 (意図しない置換!)
「ABC」という文字列が他のSKUの一部に含まれていたため、関係ないデータまで書き換わってしまいました。正しくは\bABC\b(単語境界)や^ABC-(行頭のABC + ハイフン)のように、マッチ位置を明確にする必要があります。
一括置換で起きる事故の共通点
- 「これで大丈夫だろう」と思い込んで、全件一括置換を実行してしまう
- マッチ範囲が想定より広く、意図しないデータまで書き換わる
- 置換後のデータしか残っておらず、元に戻せない
- 数千件のデータのうち、数件だけ壊れていることに気づかない
- 気づいたときには、壊れたデータがモールに反映済み
5正規表現を安全に使うためのポイント
「じゃあ正規表現は怖いから使わないほうがいい」ということではありません。正しく使えば、手作業の何十倍も速く正確に処理できる強力な道具です。重要なのは「安全に使うためのルール」を守ることです。
ポイント1:必ずテスト用データで検証する
本番データでいきなり置換を実行するのは厳禁です。必ずテスト用のコピーデータで試してから本番に適用しましょう。
検証の手順
- 本番CSVのコピーを作成する
- コピーに対して正規表現の「検索」を実行し、マッチ件数を確認する
- マッチした箇所を目視で数件チェックし、意図通りかを確認する
- 問題なければ「置換」を実行する
- 置換後のデータを目視・件数チェックする
- すべてOKなら、本番データに同じ操作を実行する
ポイント2:段階的に置換する
複雑な置換を一発でやろうとせず、シンプルな置換を複数回に分けるのが安全です。
たとえば「全角数字を半角に変換し、さらにハイフンを統一する」という処理は、一度にやろうとすると正規表現が複雑になりミスの原因になります。
- 1回目:全角数字を半角数字に変換
- 2回目:全角ハイフン類を半角ハイフンに統一
- 3回目:不要な空白を除去
各ステップの結果を確認してから次に進めば、どの段階で問題が起きたか特定しやすくなります。
ポイント3:バックアップは絶対に取る
当たり前のことですが、一括置換の前には必ず元ファイルのバックアップを取りましょう。「ファイル名_yyyymmdd_bk.csv」のようにコピーを残しておけば、最悪の場合でも元データに戻せます。
ポイント4:「全置換」の前に「1件ずつ置換」で確認する
テキストエディタの多くは、「すべて置換」の他に「次を検索 → 1件置換」というステップ実行ができます。最初の数件は1件ずつ確認し、パターンが正しいことを確かめてから「すべて置換」を実行しましょう。
ポイント5:置換結果の件数を必ず確認する
「すべて置換:1,234件を置換しました」と表示されたとき、その件数が想定通りかを確認してください。想定は100件なのに1,234件置換されていたら、明らかに何かがおかしいです。
6自力対応の限界と、プロに任せるという選択肢
正規表現は「ちょっとした検索・置換」であれば、テキストエディタで誰でも使える便利な道具です。しかし、業務で日常的に使うには、思った以上にリスクが高いのも事実です。
- 正規表現の書き方を間違えて、商品データを壊してしまう
- 毎回「今回の正規表現は合っているか?」と不安を抱えながら作業する
- 担当者が変わったら、前任者が書いた正規表現の意味がわからない
- 全角半角の混在や改行の問題など、考慮すべきパターンが多すぎる
こうした問題を根本的に解決するには、正規表現をその都度手書きするのではなく、検証済みのパターンを組み込んだ自動処理の仕組みを作るのが確実です。
正規表現の課題を仕組みで解決する方法
- GASやPythonでバリデーション処理を自動化 ―― JANコード・電話番号・メールアドレスなどのチェックを自動実行
- 一括置換ツールの作成 ―― 「送料無料タグの削除」「全角→半角変換」など、よくある置換処理をボタン1つで実行できるツール
- 置換前後の差分チェック機能 ―― 何がどう変わったかを自動でレポート出力
- バックアップの自動取得 ―― 処理前に自動でバックアップを作成する仕組み
- テスト実行モード ―― 実際には置換せず「置換したらどうなるか」のプレビューだけ表示
これらはGASやPythonで実現可能です。一度仕組みを作ってしまえば、正規表現の知識がなくても安全にデータの一括修正ができるようになります。ヒューマンエラーが入り込む余地を、仕組みの力でゼロに近づけるということです。
とはいえ、正規表現を正しく書くこと自体が専門技術です。「.」「*」「?」「+」「^」「$」の意味を正確に理解し、貪欲マッチや文字クラス、後方参照まで使いこなすには、かなりの学習コストがかかります。それを「業務の片手間」で習得するのは非効率です。
もし毎月のCSV加工業務で「一括置換で事故りそうで怖い」「正規表現がよくわからない」「データチェックに毎回時間を取られている」と感じているなら、その作業ごと自動化してしまうのが、最も確実な解決策です。