/home/by-natures/dev*

データ界隈で働くエンジニアとしての技術的なメモと、たまに普通の日記。

2023/03/27 ChatGPTで正規表現を作ってもらう

昨日、ふと10年前のエントリーの修正をしました。正規表現が間違っていたのと、オートマトンへの画像が無くなっていたので追加しました。というのも、ChatGPT に要件を伝えたら正しい正規表現が作れるのではないかと思ったためです。

結果を言うと上手くいかなかったため、自分で書き直しました。

bynatures.hatenadiary.jp

ChatGPT を使った正規表現の生成

ChatGPTのバージョンは4.0です。最初の回答はこちら。否定の先読みを使っており、これは正しいです:

xyを含まない文字列 (ChatGTP)

上のブログでは愚直に正規表現を作った場合に複雑になってしまう話を書いているので、否定の先読みを使わずにという依頼をしましたが、「xy を含まない文字列」という指示なのに、正規表現内にyを含んでいない時点で誤りだと分かります:

xyを含まない文字列(ChatGPT)-> 誤り

そのことを伝え、さらに修正してもらいました。かなりそれっぽい解答ですが、これは誤りです:

xyを含まない文字列(ChatGPT) -> 誤り

^([^x]*(x+[^xy]?)+[^x]*)*[^x]*$ ですが、最小の反例である xy に対して、前半後半に分けると xy がマッチしてしまうことが分かります:

  • 前半の ([^x]*(x+[^xy]?)+[^x]*) -> xがマッチ
  • 後半の [^x] -> y がマッチ

この後もxyがマッチしてしまうことなどを伝え続けると、ようやく正しい(否定の先読みを使わない)正規表現を得ることができました。

否定の先読みを使う場合はすぐに正しい正規表現を得ることができましたが、誤った正規表現もそれらしく解答してしまいます。精度向上もすぐにされるかと思いますが、正規表現に限らず、まだしばらくは ChatGPT の解答が正しいかどうかを確認する必要がありそうです。