ここ最近、技術的なことをブログに残してなかったので、少しづつ日々開発のお仕事をしてる中で開発に役立つと思われる備忘録的な意味も含めて残していこうと思う。まずは技術ブログを書かなくなってから変わったことといえば、今までQiitaやstackoverflowでわからないこと調べていた凡人プログラマとしては、新しいツールとしてChatGPTが出てきて課金して4.0の方を使えばだいぶまともな回答が返ってきて助かることが多くなってきました、例えば次の様な例です。
正規表現で ^[a-z]{2}[0-9]{2}[0-9]{5}0[1-5]$ というパターンはjp230000101は 当てはまりますか?
凡人プログラマにとって正規表現なんて全部覚えてるわけないので、結構曖昧だったりするんですが、まぁある程度は分かってはいるんですが、実際あってるかどうか怪しい時ってあると思います。このように聞いてみると正規表現のデバッグの専用のサイトなどを使わないでもChatGPTが理解して答えを教えてくれてデバッグできたりします。このようなダイナミックな答えが必要な質問はQiitaやstackoverflowでは難しいと思います。そこでChatGPTです。質問の回答は次のとおりでした
この正規表現は次のような構造になっています:
^[a-z]{2}
: 文字列の開始を示す^
の後、小文字の英字が2文字続く。[0-9]{2}
: 数字が2桁続く。[0-9]{5}
: 数字が5桁続く。0[1-5]
: 0に続く1桁の数字で、1から5の範囲。$
: 文字列の終了。
文字列jp230000101
をこの正規表現に照らし合わせてみると:
jp
: 2文字の小文字の英字(^[a-z]{2}
に一致)23
: 2桁の数字([0-9]{2}
に一致)00001
: 5桁の数字([0-9]{5}
に一致)01
: ここで問題が生じます。正規表現では0[1-5]
というパターンを要求しているので、0に続く数字は1から5のいずれか1桁でなければなりませんが、01
は2桁です。
したがって、jp230000101
は正規表現^[a-z]{2}[0-9]{2}[0-9]{5}0[1-5]$
には一致しません
正規表現あってる気がするのですが、あってませんと回答がきました、確かにプログラムでデバッグして正規表現をチェックするメソッドを実行してみると、弾かれてしまいます、ので、次のようにもう一度質問してみました。
では、jp230000101 を満たす正規表現はどうのようなものですか?
回答は次のようになりました。
文字列 jp230000101
に一致する正規表現を作成するには、各部分を個別に考慮します。
jp
: 小文字の英字が2文字23
: 任意の2桁の数字00001
: 任意の5桁の数字01
: 任意の2桁の数字
上記の各部分に基づいて、正規表現を作成すると以下のようになります:
^[a-z]{2}[0-9]{2}[0-9]{5}[0-9]{2}$
この正規表現は、文字列 jp230000101
に正確に一致します。
確かに条件的にはあってるのですが、最後の2桁は要件的には01-05がくるという条件なので条件が置き換わってしまいました。もう一度条件を加えて質問してみます。
最後の2桁は 01 02 03 04 05 でなければいけません、それだとどうなりますか?
回答は次の様になりました
最後の2桁が01、02、03、04、05のいずれかである必要がある場合、その部分の正規表現を変更します。
その条件を満たす正規表現は以下のようになります:
^[a-z]{2}[0-9]{2}[0-9]{5}0[1-5]$
これで、jp230000101
などの文字列が正確に一致します。最後の部分 0[1-5]
は、0に続く1桁の数字が1から5のいずれかであることを確認します。
結局元の正規表現になってしまいました。ChatGPTさんそれはないよと、質問してみました
先程それだとjp230000101は満たさないといいました、矛盾していませんか?
そうすると回答は
申し訳ございません。おっしゃるとおり、私の回答は矛盾していました。
おっしゃる通り、^[a-z]{2}[0-9]{2}[0-9]{5}0[1-5]$
の正規表現はjp230000101
には一致しません。この正規表現は0に続く1桁の数字が1から5のいずれかであることを期待しています。
最後の2桁が01、02、03、04、05のいずれかであることを確認する正規表現は以下の通りです:
^[a-z]{2}[0-9]{2}[0-9]{5}(01|02|03|04|05)$
この正規表現は、文字列jp230000101
に正確に一致します。再度、正確な情報を提供できず、ご不便をおかけしたことをお詫びいたします。
となり、上の回答に行きつきました。
結局、回答的には、最初に提示した正規表現でも良いし、上の表現でも大丈夫だと分かって、なぜプログラムでマッチしなかったかというと、ファイルから文字列を読み込んでいて、文字列に改行文字が入っていたから不一致になっているというちょっとしたミスでした。
それにしても、Web上に回答として絶対載っていない動的な質問でも、きちんと回答が得られるという時代になって、凡人プログラマとして助かるなぁ、いい時代になったなぁと感じるばかりでした