我试图编写一个函数,允许用户指定是否要在正则表达式匹配中忽略大小写。我提出了一个解决方案,但它非常笨重。有没有办法在构建正则表达式时有条件地设置std::regex_constants::icase
标志?
#include <string>
#include <regex>
std::string sub(std::string string, std::string match, bool ic){
std::regex r;
std::regex rc(match, std::regex_constants::collate);
std::regex ric(match, std::regex_constants::icase | std::regex_constants::collate);
if(ic){
r = ric;
} else {
r = rc;
}
std::smatch matches;
if(std::regex_search(string,matches, r)){
return matches[0];
} else {
return "no match";
}
}
答案 0 :(得分:3)
有许多方法可以有条件地设置标志。例如,使用条件运算符:
std::regex r(match, ic ? std::regex_constants::icase | std::regex_constants::collate
: std::regex_constants::collate);
答案 1 :(得分:1)
在这种情况下,为了便于阅读,我更喜欢好的if
:
auto flags = std::regex_constants::collate;
if(ic) flags |= std::regex_constants::icase;
std::regex r(match, flags);
此代码也比具有条件运算符?
的版本更易于维护。
考虑您希望将来添加另一个条件标志。添加另一个if
行很简单:
if(ns) flags |= std::regex_constants::nosubs;
尝试使用条件运算符执行此操作,代码将很快降级为spaghetti。