これだけでインストールは完了です。 ディレクトリ構造はそのままにしておいてください。
現在のところ、完全マッチのみに対応しています。 前方一致・後方一致・部分一致等は今後実装予定です。
Mercury::Regexを使ったサンプルコードを以下に示します。 様々な文字型やデータ構造に対応していることがわかると思います。
正規表現の構文エラーが起こった場合等にmercury::REGEX_ERROR型のエラーコードがスローされますので、必ずこの例外をキャッチして下さい。
#include <string> #include <iostream> #include "mercury/regex.h" int main(void) { const std::string pattern = "(a|bc)*d+e?"; const std::string text = "abcde"; try { const mercury::regex re(pattern); if(re.match(text)) { std::cout << "マッチしました" << std::endl; } else { std::cout << "マッチしませんでした" << std::endl; } } catch(mercury::REGEX_ERROR error) { std::string message = "Error"; switch(error) { case mercury::REGERR_SYNTAX : message = "Syntax Error" ; break; case mercury::REGERR_SET_RANGE : message = "Invalid Range of Sets" ; break; case mercury::REGERR_REPEAT_MINMAX: message = "Invalid Number of Repeat"; break; } std::cout << message << std::endl; } return 0; }
#include <string> #include <iostream> #include "mercury/regex.h" int main(void) { const std::wstring pattern = L"(a|bc)*d+e?"; const std::wstring text = L"abcde"; try { // wchar_t型はwregexを使う // 配列と文字数を渡してもOK const mercury::wregex re(pattern.c_str(), pattern.length()); if(re.match(text.c_str(), text.length())) { std::cout << "マッチしました" << std::endl; } else { std::cout << "マッチしませんでした" << std::endl; } } catch(mercury::REGEX_ERROR error) { std::string message = "Error"; switch(error) { case mercury::REGERR_SYNTAX : message = "Syntax Error" ; break; case mercury::REGERR_SET_RANGE : message = "Invalid Range of Sets" ; break; case mercury::REGERR_REPEAT_MINMAX: message = "Invalid Number of Repeat"; break; } std::cout << message << std::endl; } return 0; }
組み込み型だけでなく、文字型としてクラスを使うこともできます。 また、文字列としてリストや双方向キューも使えます。 詳細は使える文字型・データ構造を参照してください。
#include <list> #include <deque> #include <string> #include <iostream> #include "mercury/regex.h" // こんな文字型も使えます。 class character { public: character(const char ch = 0) { m_ch = ch; } bool operator==(const character &rhs) const { return m_ch == rhs.m_ch; } bool operator< (const character &rhs) const { return m_ch < rhs.m_ch; } private: char m_ch; }; int main(void) { // データをセットするのが面倒だけど、その気になれば配列やstd::string以外でもできないことはない std::list<character> pattern; pattern.push_back('('); pattern.push_back('a'); pattern.push_back('|'); pattern.push_back('b'); pattern.push_back('c'); pattern.push_back(')'); pattern.push_back('*'); pattern.push_back('d'); pattern.push_back('+'); pattern.push_back('e'); pattern.push_back('?'); std::deque<character> text; text.push_back('a'); text.push_back('b'); text.push_back('c'); text.push_back('d'); text.push_back('e'); try { // char, wchar_t以外の型はbasic_regexを使う const mercury::basic_regex<character> re(pattern); // コンテナをそのまま渡してもいいし… if(re.match(text.begin(), text.end())) // イテレータを渡してもいい { std::cout << "マッチしました" << std::endl; } else { std::cout << "マッチしませんでした" << std::endl; } } catch(mercury::REGEX_ERROR error) { std::string message = "Error"; switch(error) { case mercury::REGERR_SYNTAX : message = "Syntax Error" ; break; case mercury::REGERR_SET_RANGE : message = "Invalid Range of Sets" ; break; case mercury::REGERR_REPEAT_MINMAX: message = "Invalid Number of Repeat"; break; } std::cout << message << std::endl; } return 0; }