Boost.Spirit.Qi qi::alnum

qi::alnumは、アルファベットと10進数文字にマッチするパーサーです。

#include <iostream>
#include <string>
#include <boost/optional.hpp>
#include <boost/spirit/include/qi.hpp>

namespace qi = boost::spirit::qi;

template <class R, class Expr>
boost::optional<R> parse(const std::string& input, const Expr& expr)
{
    R result;

    typename std::string::const_iterator it = input.begin();
    if (!qi::parse(it, input.end(), expr, result)) {
        return boost::none;
    }
    return result;
}

int main()
{
    assert(parse<char>("a", qi::alnum) == 'a');
    assert(parse<char>("b", qi::alnum) == 'b');
    assert(parse<char>("c", qi::alnum) == 'c');
    assert(parse<char>("x", qi::alnum) == 'x');

    assert(parse<char>("A", qi::alnum) == 'A');
    assert(parse<char>("B", qi::alnum) == 'B');
    assert(parse<char>("C", qi::alnum) == 'C');
    assert(parse<char>("X", qi::alnum) == 'X');

    assert(parse<char>("1", qi::alnum) == '1');
    assert(parse<char>("2", qi::alnum) == '2');
    assert(parse<char>("3", qi::alnum) == '3');

    // アルファベットと10進数以外にはマッチしない
    assert(parse<char>("@", qi::alnum) == boost::none);
}