使用boost :: spirit :: lex的不区分大小写的关键字

时间:2016-10-21 11:24:23

标签: c++ boost boost-spirit case-insensitive boost-spirit-lex

有没有办法识别不区分大小写的特定模式?

E.g。如果我有

literal_bool = L"True|False";
this->self.add(literal_bool, TokenId_LiteralBool);

如何匹配trueTRUEtRuE,同时避免为每个关键字撰写[Tt][Rr][Uu][Ee]

1 个答案:

答案 0 :(得分:4)

Regular expressions supported by boost::spirit::lex包括区分大小写的控件:

  

(?r-s:pattern)

     

应用选项'r'并在解释模式时省略选项's'。   选项可以是零个或多个字符'i''s''i'   表示不区分大小写。 '-i'表示区分大小写。 's'改变了   “.”语法的含义,以匹配任何单个字符。   '-s'改变“.”的含义以匹配除了之外的任何字符   '\n'。

因此你可以写:

literal_bool = L"(?i:true|false)";
this->self.add(literal_bool, TokenId_LiteralBool);

原始回答

引入一个使模式不区分大小写的函数:

literal_bool = L"True|False";
this->self.add(make_case_insensitive(literal_bool), TokenId_LiteralBool);

常规(非宽)字符串的实现:

std::string make_case_insensitive(const std::string& s)
{
    std::string r;
    std::string cC = "[xX]";
    for(char c : s)
    {
        if ( std::isalpha(c) )
        {
            cC[1] = std::tolower(c);
            cC[2] = std::toupper(c);
            r += cC;
        }
        else
            r += c;
    }
    return r;
}