正则表达式匹配两种文件名模式之一

时间:2015-06-19 13:56:08

标签: c++ regex boost-regex

我正在尝试使用boost::regex匹配文件名,我有两种模式:

  1. XYZsomestring
  2. XYsomestringENDING
  3. 字符串somestring可以是任何字符(> 0个字符)。 文件名的开头是XYZXY。 如果是XY,则必须有字符串ENDING来终止整个序列。 我试图将两个正则表达式与|结合起来,但它不起作用。 这与第一个模式的文件名匹配:

    (XYZ)(.*)
    

    这与第二种模式的文件名匹配:

    (XY)(.*)(ENDING)
    

    但是当我将它们组合起来时,只有第一个模式匹配:

    ((XYZ)(.*))|((XY)(.*)(ENDING))
    

    所有这些都应该是不区分大小写的,这就是我在构造函数中使用boost::regex::icase的原因。 我没有icase尝试过它,也没用。)

    有什么建议吗?

1 个答案:

答案 0 :(得分:1)

可能有更简单的表达式,但我认为正则表达式^xy(?(?!z).*ending$|.*$)应该这样做:

#include <iostream>
#include <string>
#include <boost/regex.hpp>

bool bmatch(const std::string& x, const std::string& re_) {
  const boost::regex re(re_, boost::regex::icase);
  boost::smatch what;
  return boost::regex_match(x, what, re);
}

int main()
{
  std::string re = "^xy(?(?!z).*ending$|.*$)";
  std::vector<std::string> vx = { "XYZ124f5sf", "xyz12345",
                                  "XY38fsj dfENDING", "xy4 dfhd ending",
                                  "XYZ", "XY345kENDI", "xy56NDING" };
  for (auto i : vx) {
    std::cout << "\nString '" << i;
    if (bmatch(i, re)) {
      std::cout <<
        "' was matched." << std::endl;
     } else {
      std::cout <<
        "' was not matched." << std::endl;
     }
  }

  return 0;
}

这里是live demo

修改 另外,我认为正则表达式^xy(z.*|.*ending)$也可以正常工作。