AIに相談しながら正規表現を考えると捗るという話

この記事は、フラー株式会社 Advent Calendar 2023の10日目の記事です。 9日目は、@Daiji256さんのAndroid で日本語でも色々なウェイトのフォントを使いたいでした。

はじめに

  • 本当は、AIチャット + 正規表現で別のネタを書くつもりでしたが、ある理由で没となってしまいました
  • そこらへんの供養を本記事の最後に書いておくので、気になる方は見てみてください

本題

2023年はGPTを始めとした生成AIの年でしたね。

会話用のChatGPTやら、イラストを生成するStable Diffusionやら、用途に合わせたAIがいろいろ出てきましたが、個人的に一番活用したのはGitHub Copilotでした。

github.com

というのも、私が勤めるフラー株式会社では、自社のorganizationでCopilotを契約しており、エンジニアの開発業務にて利用できるようにしています。

Copilotは、AIがリアルタイムにソースコードの提案をしてくれるサービスです。 AIはGitHub上のソースコードを参考にしているだけでなく、プロジェクト内のコードを参照し、既存の実装に合わせたコードを提案してくれます。 このコード提案がとにかく便利で、もうCopilotなしの開発には戻れないくらいです。 もし、今後転職するなら、業務でのCopilotや類似サービスの利用可であることが必須になるレベルです。

Copilotは、Copilot Chatという対話型のインターフェースも提供しています。 が、私はあまりCopilot Chatを利用していません。 理由としては、ChatGPTを触ってみた時に正しくないことをさも正しいかのように回答してくるので、わからないことを質問した時にそれが正しいのかを自身が正確に評価できないためです。

私のAIチャットに対するスタンスはそういう感じなんですが、自信をもってCopilot Chatに相談するトピックがあります。

それが、正規表現です。 理由として、以下が挙げられます。

  • 既にフォーマットが確立されており、AIが誤った情報に振り回されることがないため、回答の信頼度が高い(ように思える)
  • AIが出力した正規表現が望んだ文字列にマッチするかを確かめるためのツールが存在する

実際に一緒に考えてみる

ということで、私がCopilot Chatに正規表現を考えてもらう流れを実演したいと思います。

ですが、ここで問題があります。 Copilot Chatはベータ版であるため、プレリリース版ソフトウェアに該当します。ですので、プレリリース版の秘密保持に関して、以下の制限が適用されます。

GitHub Copilot プレリリース条件 - GitHub Docs

次のことは行わないでください。(i) 本条件および秘密保持契約の対象ではない者に本ソフトウェアを開示したり、またはそのような者とソフトウェアを共有すること。(ii) 個人のSNSページを含むオンライン プラットフォーム上で、あるいはそのようなプラットフォームを経由して、本プレリリース版ソフトウェアの写真や動画を投稿したり、または他者にそのような投稿を許可すること。(iii) GitHub による事前の明示的な許可なしに、オンライン プラットフォーム上で、またはオンライン プラットフォームを介して、本ソフトウェアの何らかの要素について説明またはディスカッションすること。

上記の(ii)によって、Copilot Chatとのやりとりを本ブログに載せることはできないので、ChatGPTに代役を担当してもらいます。

例1: メールアドレスにマッチする正規表現

まずは、文章中に出現するメールアドレスにマッチする正規表現を考えてもらいましょう。

率直に尋ねてみる

出力した正規表現がどのような構造をしているのかの説明までしてくれました。親切ですね。

末尾のトップレベルドメインが少なくとも2文字以上でないといけないというのは盲点でした。

正規表現チェックツールで動作確認する

Web上の正規表現チェックツールで、望んだ結果が得られるかを確認していきます。 私は以下のツールを使っています。

正規表現チェッカー | WWWクリエイターズ

文字列中のメールアドレスにマッチすることが確認できます。

メールアドレスくらいなら、フォーマットも一定なので回答の精度が高く、そのまま使用できそうですね。

次は、もう少し複雑そうな正規表現を考えてもらいましょう。

例2: 日本円表記にマッチする正規表現

文字列中の「○○円」という日本円表記にマッチする正規表現を考えてもらいましょう。 〇〇の中の条件は、以下とします。

  • 含まれる文字は0~9とカンマ(,)のみ
  • カンマは、nを1以上の正の整数とし、3n桁目と3n+1桁目の間にのみ含まれる
  • 先頭は0以外の数字とする
率直に尋ねてみる

|以前のパターンが桁間のカンマを考慮したパターンですね。 これだといずれの桁の間にカンマを入れてもマッチするので、もっと正確にしたいですね。

制約を追加して考えてもらう

カンマは3n桁目と3n+1桁目の間に入れることを伝えます。 |以前のパターン\d{1,2}(,\d{3})*円がかなりいいですね。 まず1~2桁の数字が並び、それ以降はカンマを先頭にした数字三桁のパターンが0回以上繰り替えされるというものですね。 先頭の\d{1,2}の部分は3桁でもいいので、正確には\d{1,3}ですね。ここら辺は手動で修正すればいいと思います。

先頭の桁には0は入れないようにしてもらいましょう。 [1-9]を先頭にすれば、0以外の数値が先頭ということになりますね。手動で直そうと思っていた「カンマ前は1~3桁」というのも併せて治ってました。

ということで、日本円表記にマッチする正規表現は以下が使えそうです。

[1-9]\d{0,2}(,\d{3})*円
正規表現チェックツールで動作確認する

例1と同じようにツールを使って、目的のケースにマッチするかを確認します。 よさそう

終わりに

いかがでしたか?

正規表現を考えてもらうというおススメのAIチャット活用方法のご紹介でした。

11日目は、@furusaxさんで、「サーバーサイドのオンボーディング課題と俺たちの果てなき戦いは続く」です。

没ネタ供養

本当は、AIの力を借りるとどれだけのバフが得られるのかを計測するために、以下の成否表現ゲームをAIチャットの力を借りてプレイして、人力のみの時からどれだけスコアアップするかを計測する、というのをやりたかったです。

www.regex-hunting.com

が、ゲームの回答までの制限時間が短く、AIに聞いてその回答をゲームに入力する前に制限時間が過ぎてしまい、逆にスコアが落ちてしまうという残念な結果となってしまいました...

人力で挑戦し、ステージクリア
AIチャットの力を借りて、ステージクリアできず

我々が真に必要とするのは、余裕、なのかもしれませんね...