正規表現が不要になりました。
TinySegmenter for c++(cpp) が正規表現なくても動くようになりました。
http://code.google.com/p/tinysegmenter-cpp/
現在 sjis 依存ですが、正規表現なしで動きます。
TinySegmenter自体がそもそもあんまり正規表現を使っていなかったので、数字演算に置き換えました。
正規表現の代わりをしてくれるのはこんなルーチン。
//文字を unsigned long にする. 将来的にマクロ展開にしたい。 unsigned long TinySegmenter::stringToULong(const char * p) const { ASSERT(*p != NULL); if (*(p + 1) == 0) { return *(unsigned char*)p; } return ((*(unsigned char*)(p + 0)) << 8) + ((*(unsigned char*)(p + 1)) ); /* UTF-8等のエンコードを使う人はこっち if (*(p + 2) == 0) { return ((*(unsigned char*)(p + 0)) << 8) + ((*(unsigned char*)(p + 1)) ); } if (*(p + 3) == 0) { return ((*(unsigned char*)(p + 0)) << 16) + ((*(unsigned char*)(p + 1)) << 8) + ((*(unsigned char*)(p + 2)) ) ; } return ((*(unsigned char*)(p + 0)) << 24) + ((*(unsigned char*)(p + 1)) << 16) + ((*(unsigned char*)(p + 2)) << 8) + ((*(unsigned char*)(p + 3)) ); */ } std::string TinySegmenter::ctype_(const std::string & str) const { unsigned long c = stringToULong(str.c_str()); //utf8があるとイヤなんで unsigned longで. // this->Pattern[Pattern_M].CreatePattern("[一二三四五六七八九十百千万億兆]"); unsigned long Pattern_MArray[] = { stringToULong("一"),stringToULong("二"),stringToULong("三"),stringToULong("四") ,stringToULong("五"),stringToULong("六"),stringToULong("七"),stringToULong("八"),stringToULong("九") ,stringToULong("十"),stringToULong("百"),stringToULong("千"),stringToULong("万"),stringToULong("億") ,stringToULong("兆") , 0}; for (unsigned long * Pattern_MArrayP = Pattern_MArray ; *Pattern_MArrayP ; Pattern_MArrayP++ ) { if (c == *Pattern_MArrayP) { return "M"; } } // this->Pattern[Pattern_H].CreatePattern("[一-龠々〆ヵヶ]"); if (c >= stringToULong("一") && c <= stringToULong("龠")) { return "H"; } unsigned long Pattern_HArray[] = { stringToULong("々"),stringToULong("〆"),stringToULong("ヵ"),stringToULong("ヶ") , 0 }; for (unsigned long * Pattern_HArrayP = Pattern_HArray ; *Pattern_HArrayP ; Pattern_HArrayP++ ) { if (c == *Pattern_HArrayP) { return "H"; } } // this->Pattern[Pattern_I].CreatePattern("[ぁ-ん]"); if (c >= stringToULong("ぁ") && c <= stringToULong("ん")) { return "I"; } // this->Pattern[Pattern_K].CreatePattern("[ァ-ヴーア-ン゙ー]"); if ((c >= stringToULong("ァ") && c <= stringToULong("ヴ")) || (c >= stringToULong("ア") && c <= stringToULong("ン")) || (c == stringToULong("ー") || c == stringToULong("゙")|| c == stringToULong("ー") ) ) { return "K"; } // this->Pattern[Pattern_A].CreatePattern("[a-zA-Za-zA-Z]"); if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || (c >= stringToULong("a") && c <= stringToULong("z")) || (c >= stringToULong("A") && c <= stringToULong("Z")) ) { return "A"; } // this->Pattern[Pattern_N].CreatePattern("[0-90-9]"); if ((c >= '0' && c <= '9') || (c >= stringToULong("0") && c <= stringToULong("9")) ) { return "N"; } return "O"; }
文字→数字をマクロ展開するともっと早くなると思います。