diff --git a/modules/mol/base/src/impl/query_ast.cc b/modules/mol/base/src/impl/query_ast.cc index 697ff173f1271b36e576d37acff20e9e50df5d58..ea96a485877b9c01226f4acdfa94e69c526fcb99 100644 --- a/modules/mol/base/src/impl/query_ast.cc +++ b/modules/mol/base/src/impl/query_ast.cc @@ -120,6 +120,7 @@ StringOrRegexParam::StringOrRegexParam(): StringOrRegexParam::StringOrRegexParam(const String& s): is_regex_(false),r_(),s_(s) { + String special("[]{}()"); for(String::const_iterator it=s.begin();it!=s.end();++it) { if((*it)=='?' || (*it)=='*') { is_regex_=true; @@ -130,12 +131,16 @@ StringOrRegexParam::StringOrRegexParam(const String& s): if(is_regex_) { std::ostringstream e; for(String::const_iterator it=s.begin();it!=s.end();++it) { - if((*it)=='?') { - e << "."; - } else if((*it)=='*') { - e << ".*"; + + if((*it)=='?' && (it==s.begin() || (*(it-1))!='\\')) { + e << "."; + } else if((*it)=='*' && (it==s.begin() || (*(it-1))!='\\')) { + e << ".*"; } else { - e << *it; + if (special.find(*it)!=String::npos) { + e << '\\'; + } + e << *it; } } //std::cerr << "assembling regex [" << e.str() << "]... "; diff --git a/modules/mol/base/src/impl/query_impl.cc b/modules/mol/base/src/impl/query_impl.cc index cc5f80240bd1ddaff070ea42d518891c84419772..a70cfa813b39d63d9337cfb6135846d63796f8fb 100644 --- a/modules/mol/base/src/impl/query_impl.cc +++ b/modules/mol/base/src/impl/query_impl.cc @@ -148,7 +148,7 @@ QueryToken QueryLexer::LexNumericToken() { } bool is_ident_or_str(char c) { - static String allowed_chars("_*?"); + static String allowed_chars("_*?\\"); return isalnum(c) || allowed_chars.find_first_of(c)!=String::npos; } @@ -158,7 +158,8 @@ QueryToken QueryLexer::LexIdentOrStringToken() { bool force_string=false; while (current_<query_string_.length() && is_ident_or_str(query_string_[current_])) { - if (query_string_[current_]=='*' || query_string_[current_]=='?') { + if (query_string_[current_]=='*' || query_string_[current_]=='?' || + query_string_[current_]=='\\') { force_string=true; } current_++;