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

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をコンパイルしてリンクする必要があります。

以上

Comments:6

kobayashi 09-11-11 (水) 18:44

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

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

コスミー 09-11-13 (金) 8:41

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

kobayashi 09-11-13 (金) 9:33

どうもです。

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

コスミー 09-11-13 (金) 10:00

>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).

kobayashi 09-11-13 (金) 13:37

コスミーさん

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

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

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

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

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

コスミー 09-11-13 (金) 15:15

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

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

Comment Form
Remember personal info

Trackbacks:0

Trackback URL for this entry
http://red-treasure.com/report/wp-trackback.php?p=53
Listed below are links to weblogs that reference
C++でも正規表現を使いたいよ!本当はCでも使いたいけど! from コスミー報告書[社外秘]

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

Search
Feeds
Meta
 合計:011636
 今日:0107 昨日:0165

Return to page top