有没有办法识别不区分大小写的特定模式?
E.g。如果我有
literal_bool = L"True|False";
this->self.add(literal_bool, TokenId_LiteralBool);
如何匹配true
,TRUE
,tRuE
,同时避免为每个关键字撰写[Tt][Rr][Uu][Ee]
?
答案 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;
}