有条件地忽略c ++ 11正则表达式中的大小写

时间:2018-01-11 20:22:20

标签: c++ c++11

我试图编写一个函数,允许用户指定是否要在正则表达式匹配中忽略大小写。我提出了一个解决方案,但它非常笨重。有没有办法在构建正则表达式时有条件地设置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";
  }
}

2 个答案:

答案 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。