正規表現の便利さに気付かされた話


はじめに

  • 本記事は正規表現を解説するものではありません
  • 正規表現を使うとどれだけコード量が減るのかがわかります!

クイズを出された

コミュニティ仲間A「最近サンプルコードの改変やぐぐってばかりで自分でコーディングしてないでしょ?ちょっとやってみ!」

<hoge1234>asna<hoge1234>nsasasaという文字列を、
asnansasasaにするプログラムを書こう!

<>とその中の文字列を削除せよということですね。

なんか正規表現を使えば解けそうねー、と直感的に理解しチャレンジしてみました。(そして失敗した)
試行錯誤の流れは正規表現を学んでから別記事にまとめようと考えています。

正規表現で解いた

なんとか教えてもらいながら正規表現で解きました。
JSで書いていますが言語選定に特に理由はありません。
Javaの入門書の1単元にちょこっと載ってたのを、さらーっと読んだことがあるだけの私では、うまく解けませんでしたが、
他の仲間に手取り足取り教わることで、なんとか書くことができました。
(もっと賢い方法はあるようなのですが私にはまだ理解しきれませんでした)

4行ですね。


 let hoge = "<hoge1234>asna<hoge1234>nsasasa";
 const foo = /<[^>]*>/g

 hoge = hoge.replace(foo, "");

 console.log(hoge);

正規表現を使わずに解き直してみた

もし正規表現を使わなかったらどれだけ複雑なソースコードになるのか?
やってみました。

書き上げたあと、「もっと短縮できるでしょ」と言われましたが、
(なんなら > から始まり、 ...<hoge>...と続く文字列だと大変なことが起きますが、)
ひとまずはこれで許して!

19行です。

 const hoge = "<hoge1234>asna<hoge1234>nsasasa";
 const hoge2 = hoge.split("");

 for (let i = 0; i<hoge2.length; i++){
     const str = hoge2[i];
     if (str == "<"){
         for(let j = 0; j<hoge2.length; j++){
             const str2 = hoge2[j];
             if (str2 == ">"){
                 hoge2.splice(i, j + 1);
                 break;
             }
         }
     }
 }
 let hoge3 = "";
 for (let s of hoge2){
     hoge3 += s;
 }
 console.log(hoge3);

さいごに

今回のケースだと19行から4行に減りました。

ロジックを考えるのもひとつの勉強になると思うので、
正規表現を使わずに書いてみるのはそれはそれでアリなのですが、

どれだけ正規表現が便利かは思い知らされました。

その価値をかみしめながら、正規表現を学ぼうと思います。