Как сравнить строку с регулярным выражением?
Я хочу сравнить эти две строки с помощью регулярных выражений. Для этого использую 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 шт):
У вас неправильное регулярное выражение, экранирование символов для строковых литералов С++ тут ни при чём.
Попробуйте:
not.*\.exe
В коде:
#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);
}
Если вы хотите матчить имена программ, то регулярка должна быть сложнее. Если так, то уточните условие согласно описанию метки регулярные-выражения
- Преобразование строки для вставки (или преобразования) в регулярку делается добавлением
\перед символами[]{}.()?+*^$\|. - В твоём случае
?надо не экранировать, а заменять на.; а*- на.*. - Надо не забыть добавить маркеры начала
^и конца$строки в начало и конец регулярки. В группу можно не заключать, поскольку внутри ветвлений не используется. Если бы использовались, то надо было бы обернуть в незахватываемую группу(?:).
PS: А вообще, вместо того, чтобы всё это делать, я бы воспользовался соответствующим алгоритмом проверки соответствия имени файла маске.