2017年07月17日

boost::regexとstd::regex(tr1)、どっちを使っていこう?

去年の10月3日に、Visual C++ 2010には、STLにregex(正規表現)ライブラリが入っていたことに気づき、現時点ではboost::regex側が使われていることが確定して、10ヶ月くらいそのことを忘れていました。

STLのregex (以後はstd::regexと呼ぶ)と、boost::regexのどちらを使っていくべきか、その機能の違いや、exe生成後のサイズの比較を行い、今後どちらを使っていこうか考えようとしていたのでした。

Visual Studio 2010に入っているstd::regex(tr1)と、最新のboost::regexを比べてみると、明確な違いとしては次の項目が挙がります。

  • 文法の違い
    boost::regexの正規表現の文法はperlのものが採用されているが、std::regexの正規表現の文法はデフォルトでECMAScriptのものが採用されている。後者の方が文法の定義がしっかりしているとのこと。
  • exeファイルのサイズ
    boost::regexをリンクしたときより、std::regexをリンクしたときの方が、exeファイルのサイズが小さくなる。
  • regexのコンストラクタの引数に指定できるフラグ
    boost::regexにはデフォルト指定としてregex::normalが存在するが、std::regexには存在しない。
    regex::icaseだけを指定すると、マッチが行われない。regex::ECMAScriptもあわせて指定しなければならない。

  • マッチに関するフラグ
    boost::regexにはregex_constants::match_single_lineおよびmatch_not_dot_newlineが存在するが、std::regexには存在しない。

いずれも、Visual Studio 2010に入っているstd::regexに関する比較になります。
別のバージョンや処理系になれば、exeファイルのサイズ比較結果やフラグの指定方法も変わってくると考えられます。

例えば、regex::icaseだけを指定した場合にマッチが行われない問題は、C++11までの規則に起因する問題であり、C++14の規則に従っているバージョンならばこの問題が起きないようです。

また、Visual Studio 2010よりも後のバージョンであれば、regex_constants::match_single_line(の逆)に相当する別の定数が定義されているそうです。

なお、他の処理系では、wregex (basic_regex<wchar_t>のこと) を使う場合、日本語が正しく取り扱えないことがあったそうですが、Visual Studio 2010では正しく扱えていました。


以上のことから、次のことが言えます。
  1. std::regexの方が文法定義がしっかりしており、正規表現ライブラリのリンク後のexeファイルサイズが小さくなることから、可能ならstd::regexを使う方が良い。
  2. ただし、regex_constants::match_single_line(単一行のみにマッチすることを指すが、逆を言えば、フラグ未指定時に複数行マッチができる)および regex_constants::match_not_dot_newline(ドット(.)を改行にマッチさせないことをさすが、逆を言えば、フラグ未指定時に改行にもマッチさせることができる)を使いたいのであれば、boost::regexを使わなければならない。
現在、INASOFTで公開しているソフトウェアでboost::regexによる正規表現を用いているのは、次の4ソフトになります。


このうち、「いじくるつくーる」は、開発終了しているため検討の対象外となります。
ListView to CSV」はリスト2番目に示したフラグを使用していないため、std::regexに切り替えることができます。
改行コード変換」および「コピペテキスト修飾除去」については、リスト2番目に示したフラグを使用しているため、std::regexに切り替えることはできません。

ちなみに、ListView to CSVのexeファイルサイズは、std::regexに切り替えることにより、32bit版で413KB→335KBに減少、64bit版で499KB→393KBに減少することが確認できたので、けっこう劇的なダイエット効果があるようです。

というわけで、近いうちにListView to CSVは、使用ライブラリの切り替えのための更新を行いたいと思います。





posted by ayacy at 00:00 | Comment(0) | TrackBack(0) | プログラミング
この記事へのコメント
コメントを書く
お名前: [必須入力]

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
※ブログオーナーが承認したコメントのみ表示されます。
この記事へのトラックバックURL
http://blog.sakura.ne.jp/tb/180365208
※ブログオーナーが承認したトラックバックのみ表示されます。
※言及リンクのないトラックバックは受信されません。

この記事へのトラックバック