boost::spirit::lex不区分大小写的关键字
Case-insensitive keywords with boost::spirit::lex
是否有一种方法可以不区分大小写地识别特定的模式?
。如果我有
literal_bool = L"True|False";
this->self.add(literal_bool, TokenId_LiteralBool);
如何匹配true
, TRUE
, tRuE
,同时避免为每个关键字写[Tt][Rr][Uu][Ee]
?
boost::spirit::lex
支持的正则表达式包括大小写敏感控件:
(?r-s:pattern)
在解释模式时应用选项'r'并省略选项's'。选项可以是0个或多个字符
'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;
}
相关文章:
- Visual Studio 2015:Extern "C" 和 "export" 关键字
- C++中的"inline"关键字
- 如何确保C++函数在定义之前声明(如override关键字)
- 谷歌模拟和覆盖关键字
- 结构体 S { int align; } 之间的区别;(struct 关键字后的名称)和 struct { int al
- 如果全局变量默认是外部变量,为什么要添加"extern"关键字?
- 切换大小写后如何阻止变量重置?
- 当我从下面的代码中删除关键字 virtual 时,它可以正常工作,否则会出现错误。在这里"virtual"字的意义是什么?
- 为什么"delete"关键字不删除节点?
- 在 c++ 中正确定义"this"关键字?
- 无法找到简单的开关大小写枚举错误
- 这个额外的关键字在这个 c++ 类声明中是什么意思?
- 在 typedef 内部使用 const 关键字和在 typedef 外部使用 const 关键字之间有区别吗?
- C++ - 为什么这里需要'template'关键字?
- 仿射密码解密,输出大小写不同
- C++函数的关键字?
- 使用 'typename' 关键字将非类型视为依赖上下文中的类型
- "friend"关键字在C++中是什么意思?
- 声明C++数组(带或不带 "new" 关键字)
- boost::spirit::lex不区分大小写的关键字