

goの正規表現が遅いとネットの記事があったので似ているもので作ろうと思ったのですか、stringとregexpってどっちの方が早いのですか(適当に似ていたので言いました
コードでは比べていない)


CC BY-SA 4.0
2020-07-07T23:07:43.243
68388
2020-07-08T01:25:56.087
question
go 正規表現
golang 正規表現 ( regexp string ) パッケージどれがいいか


おそらく`string`の方が速いです。  
簡単な置換処理では[カフカの「変身」の原文で50倍程度速い](http://sgykfjsm.github.io/blog/2017/09/26/gofalsezheng-
gui-biao-xian-toreplacerwobi-jiao-sita/)例が上がっています。

なぜ冒頭で **おそらく**
と申し上げたのかというと、[`strings`パッケージ](http://golang.jp/pkg/strings)と[`regexp`パッケージ](http://golang.jp/pkg/regexp)は彫刻刀と3Dプリンタくらい機能に違いがあるからです。  
前者はIndex関数やReplace関数などで簡単な文字列操作を提供しています。  
後者は「遅い」と言われる(？)正規表現を提供しています。

なので前者を利用した場合は正規表現に必要な機能を再発明しなくてはいけません。  
自作の正規表現機能は製作者の腕次第で早くも遅くもなります。  
極端な例ですが、regexpとまったく同じアルゴリズムで正規表現を実装したならば、速度は「遅い」ものになるでしょう。

では、`regexp`パッケージは使い物にならない正規表現なのかと問われるとそんなことはありません。  
PerlやPythonなどの正規表現パッケージとは異なる`Thompson
NFA`というアルゴリズムを採用しているため、文字数が少ない時には不利ですが、文字数が多くても指数関数的な速度低下を防ぐことができます。  
おおよそ前者はO(2^n)オーダーで後者はO(n^2)オーダーという[記事](https://qiita.com/momotaro98/items/09d0f968d44c7027450d)には特徴的なグラフが載っていて、興味深い内容となっています。

その他の注意点として、正規表現を[コンパイルしていない](https://qiita.com/tj8000rpm/items/b92d7617883639a3e714)とものすごく遅くなりますので、単純に`regexp`パッケージを悪者にするのではなく、適切な実装で用いることも重要です。

参考記事: [regexpとの付き合い方](https://medium.com/eureka-
engineering/regexp%E3%81%A8%E3%81%AE%E4%BB%98%E3%81%8D%E5%90%88%E3%81%84%E6%96%B9-go%E8%A8%80%E8%AA%9E%E6%A8%99%E6%BA%96%E3%81%AE%E6%AD%A3%E8%A6%8F%E8%A1%A8%E7%8F%BE%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA%E3%81%AE%E3%83%91%E3%83%95%E3%82%A9%E3%83%BC%E3%83%9E%E3%83%B3%E3%82%B9%E3%81%A8%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0-984b6cbeeb2b)


CC BY-SA 4.0
2020-07-08T01:25:56.087
68396
2020-07-08T01:25:56.087
9820
68388
answer