2015-11-02 4 views
0

Я пытаюсь обнаружить неверный вход, где переменная n не должна содержать любого из символов: ;:"'[]*^%$#@!, определенный в regex r, в следующем коде:Использование регулярного выражения для проверки правильности ввода?

#include "iostream" 
#include "string" 
#include "sstream" 
#include "regex" 

using namespace std; 

struct Person{ 

    // constructor 
    Person(string n, int a) 
     : name(n), age(a) { 
     if (a <= 0 || a > 150) throw std::out_of_range("Age out of range."); 

     // regex r(";:\"\'[]*^%$#@!"); 
     // regex r("\:|\;|\"|\'|\[|\]|\*|\^|\%|\$|\#|\@|\!"); 
     // regex r("/[\:\;\"\'\[\]\*\^\%\$\#\@\!]/"); 
     // regex r("/[;:\"\'[]*^%$#@!]/"); 

     smatch matches; 
     regex_match(n, matches ,r); 
     if (!matches.empty()) throw std::invalid_argument("Name contains invalid symbols."); 
    } 

    // data members 
    string name; 
    int age; 
}; 

//----------------------------------------------------------------------------------------- 
int main(){ 

    try{ 

    vector<Person> people; 

    string input_termination = "end"; 
    while(true){ 
     cout <<"Type name and age; terminate with \"end\":\n>>"; 

     string line; 
     getline(cin, line); 

     stringstream ss(line); 

     string n; 
     int a; 

     ss >> n >> a; 

     if (n == input_termination) break; 
     else people.emplace_back(Person(n,a)); 
    } 

    cout <<"\nStored people: \n"; 
    for (auto it = people.begin(); it != people.end(); ++it) cout << *it <<'\n'; 

    } catch (exception& e){ 
     cerr << e.what() << endl; 
     getchar(); 
    } catch (...){ 
     cerr <<"Exception!" << endl; 
     getchar(); 
    } 

} 

комментируемых линии все неудачные попыток, которые либо привести к отсутствию throw или в следующее сообщение об ошибке:

regular expression error

Как правильно определить и использовать regex в указанном выше конструкторе, так что обнаружен n, если он содержит какой-либо из запрещенных символов?

Примечание: Я прочитал предлагаемые источники.


1. Когда недопустимое имя, содержащие некоторые из символов, используется для инициализации объекта.

+0

вы должны исправить ваши шаблоны. что вы пытаетесь сопоставить? –

+0

Я пытаюсь сопоставить следующий шаблон: '";: "'[] * ^% $ # @!" ', То есть имя не должно содержать никаких предыдущих символов. – Ziezi

+0

вам нужно избежать определенных специальных символов с символом '\'. Этот шаблон ';: \\\" \\\ '\ [\] \ * \ ^% \ $ # @! 'должен работать. Кроме того, для дальнейшего использования существуют такие сайты, как https://www.debuggex.com/, которые действительно помогают при работе с регулярным выражением –

ответ

1

основная проблема заключается в том, что есть некоторые специальные символы, которые должны быть экранированы с \ характер для того, чтобы движок регулярных выражений, чтобы прочитать его, как он сам (т.е. * это специальный маркер значение, чтобы соответствовать 0 или более предыдущий токен). Это означает, что вы не только нужно, чтобы избежать обычных ' && " персонажей, есть и другие из них вам нужно префикс с \ полукокса

вы можете, чем добиться того, что вы хотите с рисунком, как:

";:\\\"\\\'\[\]\*\^%\$#@!" 
Смежные вопросы