我正在尝试检测无效输入,其中变量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。当包含某些符号的无效名称用于初始化对象时。
答案 0 :(得分:1)
主要问题是某些特殊字符需要使用\
字符进行转义才能使正则表达式引擎将其自身读取(即*
是一个特殊的令牌含义匹配前一个标记的0或更多)。这意味着您不仅需要转义通常的' && "
字符,还需要使用\
char
你可以通过以下模式实现你想要的目标:
";:\\\"\\\'\[\]\*\^%\$#@!"