AIが返してきた長くて複雑な正規表現をエディタに映しながら、「これ、本当に正しく弾けてるのかな」と少し不安そうに、でも確かめようと落ち着いて画面に向かっている開発者

AIに正規表現を書かせて安全に使う|検証手順の型

「メールアドレスを判定する正規表現、書いといて」。 そう頼むと、AIは記号がびっしり詰まった一行をすぐに返してくれます。動かしてみると、それっぽく通る。よし、これでいこう——。

でも、コピペする指がふと止まりませんか。「これ、変な入力が来てもちゃんと弾けるんだろうか」。

その不安は、まっとうです。正規表現は、一見動いていても、際どい入力でこっそりすり抜けたり、逆に正しい値まで弾いたりするのが厄介なところ。しかもパッと見では正しさが分かりにくい。AIが返したパターンなら、なおさら「なぜこう書いたのか」が読み取りづらいですよね。

この記事は、AIに書かせた正規表現を、そのまま信じずに安全に使うための検証手順の型をまとめたものです。長く見えますが、全部は要りません。まず「3種類の入力で試す」だけ持ち帰れば、今日から効きます。

30秒のファストパス(最低ライン)
- 3種類の入力で試す:通すべき入力・弾くべき入力・際どい入力を数個ずつ用意して、実際に当てる
- 端を固定する:先頭と末尾のアンカー(^$)があるか確認する。無いと部分一致でこっそり通る
- ドットを疑う. がエスケープされているか。生の . は「何でも1文字」に化ける
※外部入力に使うなら、極端に長い文字列を1本投げて、固まらないか(後述のReDoS)も見ておく。
結論:AIの正規表現を安全に使う鍵は「実物の入力で確かめる」こと。①通す/弾く/際どいの3種類のテスト文字列を用意して当てる → ②アンカー(^ $)・ドットのエスケープ・貪欲さ・全角半角など"すり抜けやすい5点"を目で確認する → ③外部入力に使うなら極端に長い入力で固まらないか(ReDoS)を見る → ④AIに「このパターンが何を通し何を弾くか」を一言で説明させて腹落ちしてから使う。正規表現は、読んで正しさを保証するより、当てて確かめる方が確実です。

正規表現をゼロから自分で書くより、AIに叩き台を出させる方がずっと速い。 その速さは活かしたまま、最後の「当てて確かめる」だけ自分の手でやる。それで十分に安全になります。

何が起きているか——なぜAIの正規表現は危ういのか

正規表現そのものが悪いわけでも、AIが不真面目なわけでもありません。構造的に、確かめないと分からないのです。理由を先に押さえておくと、どこを見ればいいかが見えてきます。

裏を返せば——要件を短く言葉にして、実物の入力で当てて、危ういポイントだけ目視する。この3つで、危うさはぐっと減らせます。順に見ていきます。

手順1:頼む前に「通したい/弾きたい」を数個ずつ書く

AIに投げる前に、30秒だけ手を止めます。自分の言葉で、通したい例と弾きたい例を数個ずつメモするだけ。これがそのまま、後のテストにもなります。

たとえば「郵便番号(ハイフンあり)」なら:

この「際どい」を1〜2個入れておくのがコツです。ここで、AIの正規表現がいちばんボロを出します。

要件が言葉にできると、頼み方も具体的になります。「郵便番号を判定して」ではなく、「3桁ハイフン4桁だけを、文字列全体として通す正規表現を。1000001 や桁違いは弾いて」。ゴールを渡すほど、返ってくるパターンは素直になります。前提の渡し方そのものはAIにコードを書かせる前に渡す前提・制約の伝え方も参考に。

手順2:3種類の入力を、実際に当ててみる

AIが返した一つの正規表現に対して、通すべき入力・弾くべき入力・際どい入力の3種類のテスト文字列を当てて、それぞれ期待どおりかを確かめる様子を示した概念図

正規表現の正しさは、眺めて保証するより、当てて確かめる方が確実です。手順1で書いた例を、そのまま使います。

当て方は、手元でいちばん速い方法でいいです。テストコードを1個書いてもいいし、その言語の対話環境(REPL)で数行流すだけでもいい。ブラウザで動く正規表現テスターに貼ってもいい。大事なのは、頭の中ではなく実際に走らせることです。

ここで一つでも期待と違えば、それが直すべき点。特に「弾きたい入力が通ってしまった」ときは、次の手順の"すり抜けポイント"を疑います。この検証をそのままテストとして残す考え方は生成された単体テストを信用しすぎないための確認ポイント、境界の洗い出しは境界値・異常系をAIに考えさせて漏れを減らす手順も合わせてどうぞ。

手順3:すり抜けやすい5点だけ、目で確認する

当ててみて挙動が怪しいとき、あるいは念のため見ておきたいときに、ここだけ目視します。正規表現の全部を読み解く必要はありません。事故が起きやすいのは、だいたい次の5か所です。

全部を毎回見る必要はありません。当てて違和感が出た所に近い項目だけ、さっと確認すれば十分です。

手順4:外部入力に使うなら、固まらないかを見る(ReDoS)

ユーザーの入力やアップロードされた文字列など、外から来る値に正規表現を当てるなら、もう一点だけ。極端に長い入力を1本投げて、処理が固まらないかを見ておきます。

正規表現には、特定のパターン(ネストした繰り返し、たとえば (a+)+ のような形)に長い入力が来ると、照合に爆発的な時間がかかる書き方があります。これがReDoS(正規表現を使ったサービス妨害)で、悪意ある一発の入力でサーバが張りつくことすらあります。難しく考えなくて大丈夫。「同じ文字を何百・何千と並べた入力を1本当てて、一瞬で返るか」を確かめるだけでも、危ない書き方に気づけます。

もし固まる兆候があれば、AIに「このパターンはReDoSの危険がないか、あるなら書き直して」と聞き、繰り返しの入れ子を避けた形に直します。外部入力を信用しすぎない構えはプロンプトインジェクションの基本と対策とも地続きの考え方です。

手順5:AIに「何を通し、何を弾くか」を説明させる

最後に、そのパターンを使う前に、AIへ一言頼みます。

自分で全部読み解けなくても、説明と実際の挙動が食い違っていないかは照らし合わせられます。説明どおりに動かなければ、どちらかが間違っている合図。ここで、AIがもっともらしく実在しない挙動を語る(ハルシネーション)こともあるので、最終確認はやはり手順2の「当ててみる」です。AIの説明を鵜呑みにしない見方はAIのハルシネーション(もっともらしい誤り)の見抜き方にまとめています。

具体例:メールアドレスの"あるある"

いちばん頼まれがちで、いちばん穴が多いのがメール判定です。AIは複雑で長いパターンを返しがちですが、実務ではむしろシンプルに構えた方が安全なことが多い。

つまりメールは「正規表現で完璧に弾こう」と気負わず、ゆるくチェックして最終判断は別の手段に回す——これも立派な設計判断です。どこまでを正規表現に任せ、どこから別の仕組みに委ねるかの線引きはAIに任せてはいけない判断・領域の線引きの考え方が効きます。

ありがちな落とし穴

明日からやること(小さく始める3つ)

  1. AIに頼む前に、通したい例・弾きたい例を数個ずつメモする(それがそのままテストになる)
  2. 返ってきたパターンを、通す・弾く・際どいの3種類の入力で実際に当てる
  3. 怪しければ、アンカー・ドットのエスケープ・貪欲さ・全角半角の4点だけ目で確認する

この3つだけでも、「なんとなく動いてるから大丈夫」で本番に入れてヒヤッとする場面は、ぐっと減ります。慣れたらReDoSの確認やAIへの説明依頼を足していけば十分です。

AI正規表現の検証チェックリスト

「関係する所だけ見る」が前提です。全部に○は要りません。いま使おうとしているパターンに関わる所だけ、さっと確認します。

頼む前

当てて確かめる

すり抜けやすい5点

外部入力に使うなら

最後に

記号がびっしり詰まった一行を前に、「これ、本当に大丈夫かな」と手が止まる。その感覚は、力不足のサインではありません。むしろ、確かめてから使おうとする、いい構えです。

正規表現は、読んで正しさを保証しようとすると骨が折れます。でも、通す・弾く・際どいの3種類を当てて確かめるなら、誰でも同じ確実さにたどり着ける。AIが叩き台を速く出してくれるぶん、あなたは最後の「当てて確かめる」に集中すればいい。役割を分ければ、速さと安全は両立します。

AIは、正規表現をゼロから書く手間を肩代わりしてくれる頼れる相棒です。最後にそれを本番へ通す判断は、入力の実態を知っているあなたの手で。

AIが書いた正規表現を通す・弾く・際どいの入力で確かめ終えて、「よし、これなら安心して使える」と表情がやわらぎ、次の実装へ落ち着いて向かおうとしている開発者

今日ひとつ、「返ってきた正規表現は、3種類の入力で当ててから使う」を決められたなら、それはもう、"なんとなく動く"を"確かめて使う"に変える確かな一歩です。

よければ、こちらも