使い方

インストール方法

  1. パッケージに含まれているヘッダファイルをプロジェクトフォルダに全てコピー

これだけでインストールは完了です。 ディレクトリ構造はそのままにしておいてください。

使用方法

  1. 正規表現を使う場所で"mercury/regex.h"をインクルード
  2. コンストラクタに正規表現パターンを渡す
  3. match()で完全マッチを行う

現在のところ、完全マッチのみに対応しています。 前方一致・後方一致・部分一致等は今後実装予定です。

サンプルコード

Mercury::Regexを使ったサンプルコードを以下に示します。 様々な文字型やデータ構造に対応していることがわかると思います。

文字型=char, 文字列=std::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)
	{
		switch(error)
		{
		case mercury::REGERR_SYNTAX:
			std::cout << "Syntax Error" << std::endl;
			break;
		}
	}
	return 0;
}

文字型=wchar_t, 文字列=配列

#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)
	{
		switch(error)
		{
		case mercury::REGERR_SYNTAX:
			std::cout << "Syntax Error" << std::endl;
			break;
		}
	}
	return 0;
}

文字型=その他クラス, 文字列=その他コンテナ

組み込み型だけでなく、文字型としてクラスを使うこともできます。 また、文字列としてリストや双方向キューも使えます。 詳細は使える文字型・データ構造を参照してください。

#include <list>
#include <deque>
#include <iostream>
#include "mercury/regex.h"

// こんな文字型も使えます。
class character
{
public:
	character(const char ch = 0) { m_ch = ch; }
	void operator= (const character &rhs)       { m_ch = rhs.m_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)
	{
		switch(error)
		{
		case mercury::REGERR_SYNTAX:
			std::cout << "Syntax Error" << std::endl;
			break;
		}
	}
	return 0;
}