正規表現が不要になりました。

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";
}

文字→数字をマクロ展開するともっと早くなると思います。