使用正则表达式检查输入有效性?

时间:2015-11-02 23:09:04

标签: c++ regex

我正在尝试检测无效输入,其中变量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 1 或出现以下错误消息:

  

regular expression error

如何在上面的构造函数中正确定义和使用regex,以便在它包含任何禁用符号时检测到n

注意:我已阅读建议的来源。

1。当包含某些符号的无效名称用于初始化对象时。

1 个答案:

答案 0 :(得分:1)

主要问题是某些特殊字符需要使用\字符进行转义才能使正则表达式引擎将其自身读取(即*是一个特殊的令牌含义匹配前一个标记的0或更多)。这意味着您不仅需要转义通常的' && "字符,还需要使用\ char

前缀的其他字符

你可以通过以下模式实现你想要的目标:

";:\\\"\\\'\[\]\*\^%\$#@!"