C++でも正規表現を使いたいよ!本当はCでも使いたいけど!

今はもうない読んだ。まあ、いわゆるひとつの「やられた」。いつものことですが。
萌絵みたいな女性がいたら、一度ぎゃふんと言わされてみたい。

C++で正規表現。
boostとか使えばできますが、boostって結構でかいって言うか、ちょっと正規表現使いたいだけなのにboostの諸々を入れるのは面倒、ということはあるんじゃないかと思います。
で、便利じゃないかと思ってるのがGRETAです。
(2010/05/20 ↑消えたっぽい。とりあえずこっち。)
VCで使うという条件で、商用利用もフリーで可だったと思われるライブラリです。
簡単な使い方だけ示しておきます。(要望があれば多少詳しく説明します。)


#include < iostream >
#include < string >
#include "regexpr2.h"

int main(int argc, char *argv[]) {
    regex::match_results results;  // 結果格納用変数
    string str("abcdefg12345hijk"); // 検索対象文字列

    regex::rpattern pat("\\d+(\\w+)");  // 正規表現。\\は2個要るよ!
    regex::match_results::backref_type br = pat.match( str, results );  // マッチ。brはマッチした部分が入る。br=="12345hijk"
    std::cout << br << std::endl; // 12345hjik
    regex::match_results::backref_vector all_br = results.all_backrefs();  // 後方参照をするためのvector。
    std::cout << all_br[0] << std::endl; // 12345hjik
    std::cout << all_br[1] << std::endl; // hjik


    regex::rpattern subst("\\d+", "zzzz", regex::GLOBAL);  // 置換定義。置換前、置換後、パラメータ。
    regex::subst_results substitute_results;
    subst.substitute(str, substitute_results);
    std::cout << str << std::endl; // abcdefgzzzzhijk

    return 0;
}

wstringを使いたい場合はbasic_rpatternなどがあります。
置換はパラメータをいろいろ与えることで、全部置換とか最初の一個とか指定できます。
また、置換だけでなくsplitとかもあります。
注意事項としては、GRETAは完全なテンプレートライブラリというわけではなく、regexpr2.cppとsyntax2.cppをコンパイルしてリンクする必要があります。

以上

コスミー について

昔(?)はゲーム作ってました。 今もなんか作ろうとしています。
カテゴリー: C++, Tips パーマリンク

C++でも正規表現を使いたいよ!本当はCでも使いたいけど! への7件のフィードバック

  1. kobayashi のコメント:

    VC6.0で利用できる商用利用可の正規表現ライブラリを探していて、このページにたどり着きました。
    早速GRETAを探してDLしましたが、添付のライセンスを見る限りでは、お金を払わない限り、商用利用は不可と読めます。
    (会社の外国語専攻の奴に訳してもらいましたが、不完全かも知れません)

    昔のソフトの手直しで正規表現をぶち込むことになりましたが、商用利用できる適当なものがなかなかないですね。
    VS-FlexStringを検討しましたが、グループ”()”やor”|”が使えないため挫折しました。

  2. コスミー のコメント:

    商用利用不可でしたか。
    今ダウンロードできるものは、確かにそう書いてあるように思いますね・・・。
    ちょっと確認してみます。

  3. kobayashi のコメント:

    どうもです。

    昨日はJre.dllを試しに動作させてみました。
    現在、Boost Regexに挑戦しています。
    しかしBoostのほうはでかいですね。
    正規表現だけビルドするのにどんだけ時間かかるねんっ!って感じでした。(^^;

  4. コスミー のコメント:

    >kobayashiさん

    私が商用利用可といっていた根拠は,下記ページを見ていただくと分かると思います.
    ただ,GotDotNetが閉鎖してしまったので,今はどうなるんでしょうね・・・.

    http://web.archive.org/web/20080424041153/http://research.microsoft.com/projects/greta/

    (以下の部分↓
    New! GRETA is now available free for commercial use as part of Visual C++ PowerTools. You can find it on GotDotNet (just look for PowerTools).

  5. kobayashi のコメント:

    コスミーさん

    調べて下さってありがとう御座います。
    感謝します。

    >ただ,GotDotNetが閉鎖してしまったので,今はどうなるんでしょうね・・・.

    商用に利用するにはちょっと不安ですね。
    GRETA、軽くて良さそうだったのですが、やめておこうと思います。

    ありがとう御座いました。

    ちなみにBoostRegexのほうは動作させることができました。
    最新の1.40.0はVC6.0でのビルドでエラーがでますので古いバージョンに遡って使っています。

  6. コスミー のコメント:

    解決されたようで,よかったです.
    Power Toolsがどこかに引き継がれているはず,とは思うんですけどねえ.

    ちなみにboostでしたらboost:regex以外にboost::xpressiveというのがあって,GRETAと作者が同じだったりします(確か).テンプレートオンリーという面白い正規表現ライブラリになっています.

  7. DIY Combo Kits のコメント:

    Everything is very open with ɑ precise explanatiоn of the issues.

    It was reaⅼly informatіve. Ⲩour site is very helpful. Thanks for
    sharing!

コメントを残す

メールアドレスが公開されることはありません。