Я пытаюсь обнаружить неверный вход, где переменная 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. Когда недопустимое имя, содержащие некоторые из символов, используется для инициализации объекта.
вы должны исправить ваши шаблоны. что вы пытаетесь сопоставить? –
Я пытаюсь сопоставить следующий шаблон: '";: "'[] * ^% $ # @!" ', То есть имя не должно содержать никаких предыдущих символов. – Ziezi
вам нужно избежать определенных специальных символов с символом '\'. Этот шаблон ';: \\\" \\\ '\ [\] \ * \ ^% \ $ # @! 'должен работать. Кроме того, для дальнейшего использования существуют такие сайты, как https://www.debuggex.com/, которые действительно помогают при работе с регулярным выражением –