
AIに正規表現を書かせて安全に使う|検証手順の型
「メールアドレスを判定する正規表現、書いといて」。 そう頼むと、AIは記号がびっしり詰まった一行をすぐに返してくれます。動かしてみると、それっぽく通る。よし、これでいこう——。
でも、コピペする指がふと止まりませんか。「これ、変な入力が来てもちゃんと弾けるんだろうか」。
その不安は、まっとうです。正規表現は、一見動いていても、際どい入力でこっそりすり抜けたり、逆に正しい値まで弾いたりするのが厄介なところ。しかもパッと見では正しさが分かりにくい。AIが返したパターンなら、なおさら「なぜこう書いたのか」が読み取りづらいですよね。
この記事は、AIに書かせた正規表現を、そのまま信じずに安全に使うための検証手順の型をまとめたものです。長く見えますが、全部は要りません。まず「3種類の入力で試す」だけ持ち帰れば、今日から効きます。
30秒のファストパス(最低ライン)
- 3種類の入力で試す:通すべき入力・弾くべき入力・際どい入力を数個ずつ用意して、実際に当てる
- 端を固定する:先頭と末尾のアンカー(^と$)があるか確認する。無いと部分一致でこっそり通る
- ドットを疑う:.がエスケープされているか。生の.は「何でも1文字」に化ける
※外部入力に使うなら、極端に長い文字列を1本投げて、固まらないか(後述のReDoS)も見ておく。
結論:AIの正規表現を安全に使う鍵は「実物の入力で確かめる」こと。①通す/弾く/際どいの3種類のテスト文字列を用意して当てる → ②アンカー(^ $)・ドットのエスケープ・貪欲さ・全角半角など"すり抜けやすい5点"を目で確認する → ③外部入力に使うなら極端に長い入力で固まらないか(ReDoS)を見る → ④AIに「このパターンが何を通し何を弾くか」を一言で説明させて腹落ちしてから使う。正規表現は、読んで正しさを保証するより、当てて確かめる方が確実です。
正規表現をゼロから自分で書くより、AIに叩き台を出させる方がずっと速い。 その速さは活かしたまま、最後の「当てて確かめる」だけ自分の手でやる。それで十分に安全になります。
何が起きているか——なぜAIの正規表現は危ういのか
正規表現そのものが悪いわけでも、AIが不真面目なわけでもありません。構造的に、確かめないと分からないのです。理由を先に押さえておくと、どこを見ればいいかが見えてきます。
- 見た目で正しさが分からない:記号の羅列は、人間には検算しづらい。1文字違うだけで意味が変わるのに、その違いが目で追いにくい
- 「よくある例」を返しがち:AIはネット上に無数にある"それっぽい"パターンを学習しています。有名だけど穴のある正規表現(特にメール判定)をそのまま返すことがある
- 要件が言葉にできていない:そもそも「何を通して何を弾きたいか」が曖昧なまま頼むと、AIも当てずっぽうになる。すり抜けは、AIのせいというより指示の曖昧さから来ることが多い
- 端の扱いが抜けやすい:部分一致でよいのか、全体一致させたいのか。ここが指定されないと、意図せず"含んでいれば通る"パターンになる
裏を返せば——要件を短く言葉にして、実物の入力で当てて、危ういポイントだけ目視する。この3つで、危うさはぐっと減らせます。順に見ていきます。
手順1:頼む前に「通したい/弾きたい」を数個ずつ書く
AIに投げる前に、30秒だけ手を止めます。自分の言葉で、通したい例と弾きたい例を数個ずつメモするだけ。これがそのまま、後のテストにもなります。
たとえば「郵便番号(ハイフンあり)」なら:
- 通したい:
100-0001、012-3456 - 弾きたい:
1000001(ハイフン無し)、10-0001(桁足りない)、100-00012(桁多い)、abc-defg - 際どい:
100-0001の前後に空白や文字がついたもの(100-0001、x100-0001x)
この「際どい」を1〜2個入れておくのがコツです。ここで、AIの正規表現がいちばんボロを出します。
要件が言葉にできると、頼み方も具体的になります。「郵便番号を判定して」ではなく、「3桁ハイフン4桁だけを、文字列全体として通す正規表現を。1000001 や桁違いは弾いて」。ゴールを渡すほど、返ってくるパターンは素直になります。前提の渡し方そのものはAIにコードを書かせる前に渡す前提・制約の伝え方も参考に。
手順2:3種類の入力を、実際に当ててみる

正規表現の正しさは、眺めて保証するより、当てて確かめる方が確実です。手順1で書いた例を、そのまま使います。
- 通すべき入力:全部きちんとマッチするか(正しい値を弾いていないか)
- 弾くべき入力:全部ちゃんと外れるか(ダメな値を通していないか)
- 際どい入力:前後に余計な文字・空白がついたもの、空文字、想定より長いもの
当て方は、手元でいちばん速い方法でいいです。テストコードを1個書いてもいいし、その言語の対話環境(REPL)で数行流すだけでもいい。ブラウザで動く正規表現テスターに貼ってもいい。大事なのは、頭の中ではなく実際に走らせることです。
ここで一つでも期待と違えば、それが直すべき点。特に「弾きたい入力が通ってしまった」ときは、次の手順の"すり抜けポイント"を疑います。この検証をそのままテストとして残す考え方は生成された単体テストを信用しすぎないための確認ポイント、境界の洗い出しは境界値・異常系をAIに考えさせて漏れを減らす手順も合わせてどうぞ。
手順3:すり抜けやすい5点だけ、目で確認する
当ててみて挙動が怪しいとき、あるいは念のため見ておきたいときに、ここだけ目視します。正規表現の全部を読み解く必要はありません。事故が起きやすいのは、だいたい次の5か所です。
- アンカー(
^と$):先頭・末尾を固定しているか。無いと「その文字列を"含んでいれば"通る」になり、x100-0001xのような入力もすり抜ける。全体を厳密に判定したいなら、両端のアンカーはほぼ必須 - ドット
.のエスケープ:URLやファイル名で.を"文字としてのドット"にしたいのに、生の.だと「任意の1文字」になる。\.になっているか - **貪欲さ(
.*.+)**:.は欲張って伸びます。想定より広く飲み込んでいないか。範囲を絞れるなら[^/]のように「何でも」を避ける - 文字クラスの想定漏れ:全角・半角(
0と0)、大文字小文字、ハイフンに見える別記号(ー−-)、前後の空白。日本語の入力では特に化けやすい - エスケープと特殊文字:
|()[{+?などを"文字そのもの"として使いたい場面でエスケープ漏れがないか
全部を毎回見る必要はありません。当てて違和感が出た所に近い項目だけ、さっと確認すれば十分です。
手順4:外部入力に使うなら、固まらないかを見る(ReDoS)
ユーザーの入力やアップロードされた文字列など、外から来る値に正規表現を当てるなら、もう一点だけ。極端に長い入力を1本投げて、処理が固まらないかを見ておきます。
正規表現には、特定のパターン(ネストした繰り返し、たとえば (a+)+ のような形)に長い入力が来ると、照合に爆発的な時間がかかる書き方があります。これがReDoS(正規表現を使ったサービス妨害)で、悪意ある一発の入力でサーバが張りつくことすらあります。難しく考えなくて大丈夫。「同じ文字を何百・何千と並べた入力を1本当てて、一瞬で返るか」を確かめるだけでも、危ない書き方に気づけます。
もし固まる兆候があれば、AIに「このパターンはReDoSの危険がないか、あるなら書き直して」と聞き、繰り返しの入れ子を避けた形に直します。外部入力を信用しすぎない構えはプロンプトインジェクションの基本と対策とも地続きの考え方です。
手順5:AIに「何を通し、何を弾くか」を説明させる
最後に、そのパターンを使う前に、AIへ一言頼みます。
- 「この正規表現が、具体的に何を通して何を弾くかを、例を3つずつ挙げて説明して」
- 「この書き方で、すり抜ける入力・逆に弾いてしまう正しい入力はある?」
自分で全部読み解けなくても、説明と実際の挙動が食い違っていないかは照らし合わせられます。説明どおりに動かなければ、どちらかが間違っている合図。ここで、AIがもっともらしく実在しない挙動を語る(ハルシネーション)こともあるので、最終確認はやはり手順2の「当ててみる」です。AIの説明を鵜呑みにしない見方はAIのハルシネーション(もっともらしい誤り)の見抜き方にまとめています。
具体例:メールアドレスの"あるある"
いちばん頼まれがちで、いちばん穴が多いのがメール判定です。AIは複雑で長いパターンを返しがちですが、実務ではむしろシンプルに構えた方が安全なことが多い。
- 完璧に判定しようとしない:メールアドレスの厳密な仕様はとても複雑で、「正規表現だけで100%正しく判定する」のは現実的でありません。実務では「
@が1つあって、その前後に文字があり、ドメイン側にドットがある」程度のゆるい形式チェックにとどめ、本当に届くかは確認メールで確かめるのが定石 - アンカー忘れに注意:
^$が無いと、"あああ user@example.com いいい"のような文字列でも部分一致で通ってしまう .のエスケープ:ドメイン部の.が生のままだと、意図しない文字も通る
つまりメールは「正規表現で完璧に弾こう」と気負わず、ゆるくチェックして最終判断は別の手段に回す——これも立派な設計判断です。どこまでを正規表現に任せ、どこから別の仕組みに委ねるかの線引きはAIに任せてはいけない判断・領域の線引きの考え方が効きます。
ありがちな落とし穴
- 返ってきた瞬間にコピペ:当てて確かめる前に本番へ入れてしまう
- 通すべき入力しか試さない:「正しい値が通った」だけで安心し、ダメな値がすり抜けているのに気づかない
- アンカー無しで全体一致のつもり:部分一致になっていて、余計な文字がついた入力を通す
.を生のまま使う:ドットが「任意の1文字」に化けて、想定外を通す- 全角・空白を忘れる:日本語入力で全角数字や前後の空白が混じり、正しい値を弾く/ダメな値を通す
- 外部入力にReDoSの確認をしない:長い入力で固まる書き方のまま公開してしまう
- AIの説明だけで納得する:実際に走らせず、語られた挙動を信じてしまう
明日からやること(小さく始める3つ)
- AIに頼む前に、通したい例・弾きたい例を数個ずつメモする(それがそのままテストになる)
- 返ってきたパターンを、通す・弾く・際どいの3種類の入力で実際に当てる
- 怪しければ、アンカー・ドットのエスケープ・貪欲さ・全角半角の4点だけ目で確認する
この3つだけでも、「なんとなく動いてるから大丈夫」で本番に入れてヒヤッとする場面は、ぐっと減ります。慣れたらReDoSの確認やAIへの説明依頼を足していけば十分です。
AI正規表現の検証チェックリスト
「関係する所だけ見る」が前提です。全部に○は要りません。いま使おうとしているパターンに関わる所だけ、さっと確認します。
頼む前
- 通したい入力を数個、言葉にできたか
- 弾きたい入力を数個、言葉にできたか
- 際どい入力(前後の余計な文字・空文字・長い入力)を1〜2個用意したか
- 「全体一致か部分一致か」をAIに伝えたか
当てて確かめる
- 通すべき入力が、全部マッチしたか(正しい値を弾いていないか)
- 弾くべき入力が、全部外れたか(ダメな値を通していないか)
- 際どい入力で、期待どおりの結果になったか
- 頭の中でなく、実際に走らせて確かめたか
すり抜けやすい5点
- 先頭・末尾のアンカー(
^ $)はあるか - ドット
.はエスケープされているか(文字として使いたい場合) -
.*.+が想定より広く飲み込んでいないか - 全角・半角・大文字小文字・空白・似た記号の想定漏れはないか
- 使いたい特殊文字のエスケープ漏れはないか
外部入力に使うなら
- 極端に長い入力を1本当てて、固まらないか(ReDoS)
- AIに「何を通し何を弾くか」を説明させ、実挙動と照らしたか
最後に
記号がびっしり詰まった一行を前に、「これ、本当に大丈夫かな」と手が止まる。その感覚は、力不足のサインではありません。むしろ、確かめてから使おうとする、いい構えです。
正規表現は、読んで正しさを保証しようとすると骨が折れます。でも、通す・弾く・際どいの3種類を当てて確かめるなら、誰でも同じ確実さにたどり着ける。AIが叩き台を速く出してくれるぶん、あなたは最後の「当てて確かめる」に集中すればいい。役割を分ければ、速さと安全は両立します。
AIは、正規表現をゼロから書く手間を肩代わりしてくれる頼れる相棒です。最後にそれを本番へ通す判断は、入力の実態を知っているあなたの手で。

今日ひとつ、「返ってきた正規表現は、3種類の入力で当ててから使う」を決められたなら、それはもう、"なんとなく動く"を"確かめて使う"に変える確かな一歩です。
よければ、こちらも
- 生成物をそのまま使わない構えは生成コードをそのまま使わない最低限の動作確認の型へ。
- 境界値・異常系の洗い出しは境界値・異常系をAIに考えさせて漏れを減らす手順へ。
- AIの「たぶんこれ」を見抜く型はAIのハルシネーションの見抜き方へ。