INASOFT 管理人のひとこと


フリーソフトダウンロードサイト「INASOFT」の管理人 矢吹拓也 が日々の「ひとこと」を語るページです。
2021年1月1日より、旧ブログ(blog.inasoft.org)からお引越ししました。
・INASOFT Webサイト: https://www.inasoft.org/
・管理人のふたこと(長文記事/寄稿文): https://www.inasoft.org/talk/
本業の方のお仕事が再び忙しくなりつつあるので、断続的にしばらく更新が止まることがあります。

目次 | ←前へ / 2017-07-17 00:00 / 次へ→ / 最新へ⇒

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

2017/ 7/17 0:00:00


RSSRSS配信中

https://www.inasoft.org/








去年の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は、使用ライブラリの切り替えのための更新を行いたいと思います。



目次 | ←前へ / 2017-07-17 00:00 / 次へ→ / 最新へ⇒


目次の表示:


ブログではないので、コメント機能とトラックバック機能は提供していません。ご質問・ご意見等はメールフィードバックまたはTwitter等からお願いします。いただいたご質問・ご意見などは、この「管理人のひとこと」の記事に追加、あるいは新規の記事にする形で一部または全文をそのまま、あるいは加工させていただいた上で、ご紹介させていただく場合があります。
当サイトでは掲載内容による不具合等に関する責任を持ちません。また、内容の正確性についての保証もありませんので、情報をご利用の際は、利用者の自己責任で確認をお願いします。本ページは公開から1年半後の任意のタイミングで削除される予定です。




2557681 (+0492)[+0622]

Copyright© 2010-2021 INASOFT