Как сравнить строку с регулярным выражением?

Я хочу сравнить эти две строки с помощью регулярных выражений. Для этого использую regex_match и код из этого вопроса. Но почему-то сравнение возвращает false. По возможности лучше не изменять строку not*.exe, потому что на её месте может быть строка подобного типа и добавлять ,например, экранирование спец символов( или другие дополнительные символы для регулярного выражения) в разные места будет трудно. Можно ли универсально мэтчить имена программ, как в этом примере?

    std::string string("notepad.exe");
    std::regex regex("not*.exe");
    std::cout << std::boolalpha << std::regex_match(string, regex);

Как правильно сравнивать подобные строки,когда одна из них известна целиком, а другая включает в себя регулярные выражения?


Ответы (2 шт):

Автор решения: dIm0n

У вас неправильное регулярное выражение, экранирование символов для строковых литералов С++ тут ни при чём.

Попробуйте:

not.*\.exe

Тест https://regexr.com/59juu

В коде:

#include <string>
#include <regex>
#include <iostream>
#include <ios>

int main() {
    std::string string{"notepad.exe"};
    std::regex regex{R"~(not.*\.exe)~"};
    std::cout << std::boolalpha << std::regex_match(string, regex);
}

Если вы хотите матчить имена программ, то регулярка должна быть сложнее. Если так, то уточните условие согласно описанию метки

→ Ссылка
Автор решения: Qwertiy
  • Преобразование строки для вставки (или преобразования) в регулярку делается добавлением \ перед символами []{}.()?+*^$\|.
  • В твоём случае ? надо не экранировать, а заменять на .; а * - на .*.
  • Надо не забыть добавить маркеры начала ^ и конца $ строки в начало и конец регулярки. В группу можно не заключать, поскольку внутри ветвлений не используется. Если бы использовались, то надо было бы обернуть в незахватываемую группу (?:).

PS: А вообще, вместо того, чтобы всё это делать, я бы воспользовался соответствующим алгоритмом проверки соответствия имени файла маске.

→ Ссылка