Ошибка C : нет соответствующей функции для вызова ‘regex_match ()’

#c #regex #match

#c #регулярное выражение #совпадение

Вопрос:

Я борюсь с этой ошибкой компилятора C , чтобы заставить мою функцию regex_match () работать. Код:

 #include <iostream>
#include <string>
#include <regex>
using namespace std;

struct Person {
    Person(string name, int age)
        : n{name}, a{age}
    {
        regex r("^([!:*amp;%#@^\[\]"']) ");             // :*[]"'amp;^%#@!
        for(char test : n) {
            cout << "Character: " << test;
            if(regex_match(test, r)) {
                cout << endl << "Error: wrong character!" << endl;
            }
        }
    }
    string n;
    int a;
};

int main() {
    Person Goofy("Goofy",11);
    return 0;
}
 

Я хочу проверить, содержит ли n хотя бы один из символов, которые я написал в регулярном выражении r ().

Кстати, для людей, изучающих регулярные выражения, я нашел отличный веб-сайт: https://regex101.com .

Какие-либо предложения? Спасибо!!

Ответ №1:

test является символом. std::regex_match Для действия нет char перегрузки.

Я не уверен, хотите ли вы проверять каждый символ по списку символов или только первый. Если это все, вы можете использовать std::any_of :

 char const constexpr m[] = R"(:*[]"'amp;^%#@!)";
for(char test : n) {
    if(any_of(begin(m), end(m), [test](char c){ return c == test; })) {
        cout << endl << "Error: wrong character!" << endl;
    }
}
 

Основываясь на дополнительных комментариях, я думаю, что понимаю, что вы хотели: проверьте n , содержит ли строка какие-либо «недопустимые» символы. Для этой задачи std::regex_search лучше подходит:

 regex r{R"([:*[]"'amp;^%#@!])"};

if(regex_search(n, r)){
    cout << endl << "Error: wrong character!" << endl;
}
 

Комментарии:

1. Я новичок, не могли бы вы объяснить, пожалуйста? Преобразование теста char в строку не сработало..

2. Я отредактировал пример. regex_match предполагается, что строка соответствует регулярному выражению, а не одному символу. Это не намного больше, чем это.

3. @m3n741 если бы вы могли сказать мне, чего именно вы пытаетесь достичь, я мог бы помочь вам лучше, я надеюсь.

4. std::find_first_of(n.begin(), n.end(), m.begin(), m.end()) эквивалентно тесту в вашем первом фрагменте и не требует цикла или лямбда.

5. Я хотел проверить, есть ли в строке n какой-либо из знаков регулярного выражения r, и могу ли я использовать regex_match для этого. Спасибо за быстрый ответ 🙂