昨日、ふと10年前のエントリーの修正をしました。正規表現が間違っていたのと、オートマトンへの画像が無くなっていたので追加しました。というのも、ChatGPT に要件を伝えたら正しい正規表現が作れるのではないかと思ったためです。
結果を言うと上手くいかなかったため、自分で書き直しました。
ChatGPT を使った正規表現の生成
ChatGPTのバージョンは4.0です。最初の回答はこちら。否定の先読みを使っており、これは正しいです:
上のブログでは愚直に正規表現を作った場合に複雑になってしまう話を書いているので、否定の先読みを使わずにという依頼をしましたが、「xy
を含まない文字列」という指示なのに、正規表現内にy
を含んでいない時点で誤りだと分かります:
そのことを伝え、さらに修正してもらいました。かなりそれっぽい解答ですが、これは誤りです:
^([^x]*(x+[^xy]?)+[^x]*)*[^x]*$
ですが、最小の反例である xy
に対して、前半後半に分けると xy
がマッチしてしまうことが分かります:
- 前半の
([^x]*(x+[^xy]?)+[^x]*)
->x
がマッチ - 後半の
[^x]
->y
がマッチ
この後もxy
がマッチしてしまうことなどを伝え続けると、ようやく正しい(否定の先読みを使わない)正規表現を得ることができました。
否定の先読みを使う場合はすぐに正しい正規表現を得ることができましたが、誤った正規表現もそれらしく解答してしまいます。精度向上もすぐにされるかと思いますが、正規表現に限らず、まだしばらくは ChatGPT の解答が正しいかどうかを確認する必要がありそうです。