2016-10-21 12 views
2

大文字と小文字を区別しない特定のパターンを認識する方法はありますか?boost :: spirit :: lexで大文字と小文字を区別しないキーワード

など。私は

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

を持っている場合は、各キーワードの[Tt][Rr][Uu][Ee]を書くことを回避しながら、どのように私はtrueTRUEtRuEを一致させることができますか?

答えて

4

Regular expressions supported by boost::spirit::lexは大文字感度制御を含む:

(?r-s:pattern)

はオプション 'r' を適用してパターンを解釈しながら、オプション 's' を省略します。 オプションは0または1つ以上の文字'i'または's'です。 'i' は、大文字と小文字を区別しないことを示します。 '-i'は、大文字と小文字を区別します。 's'は、 の意味を「.」の構文に変更して、任意の1文字に一致させます。 は、 '\n'以外の文字に一致するように '.'の意味を変更します。

したがって、あなたが書くことができます。

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

Implementatio:

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

オリジナル答え

は、パターンケースが鈍感機能を導入します通常の(非ワイド)文字列の場合:n

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; 
} 
関連する問題