2015-10-24 3 views
4

Что не так с регулярным выражением, которое я использовал?C++: Почему шаблон регулярного выражения "[+ -/*]" соответствует строке "."?

#include<regex> 
#include<iostream> 
#include<string> 
using namespace std; 
int main(int argc,char *argv[]) 
{ 
    smatch results; 
    string temp("[+-/*]"); 
    string test("."); 

    regex r(temp); 

    if(regex_search(test,results,r)) 
     cout<<results.str()<<endl; 
    return 0; 
} 

"." будет распечатываться, и если я использую '\' для создания escape-последовательности, например:

string temp("[\\+-/\\*]"); 

Выход остается.

+0

Посмотрите на необработанные строки из C++ 11 - они великолепны! – Downvoter

ответ

8

Проблема в том, что - интерпретируется по-разному внутри класса символов [], охватывая символы в диапазоне. Это интерпретация -, которая позволяет вам определять [A-Z] для покрытия всех прописных букв или [0-9] для покрытия всех десятичных цифр.

Если вы хотите использовать -, поместите его в начале или в конце блока, или избежать его \:

string temp("[-+/*]"); 

В противном случае, [+-/] охватывает все символы с кодами между '+' (43) и(47) включительно, т.е. '+', ',', '-', '.' и '/'.

Смежные вопросы