在字符串正则表达式c ++中查找模式

时间:2013-08-15 14:26:59

标签: c++ regex boost

我有以下字符串:E:\501_Document_60_1_R.xml

我正在尝试找到模式"_R"

我使用以下内容:boost::regex rgx("[R]");

但它不起作用:“清空匹配”

谢谢。

代码:

vector<string> findMono(string s)
{
    vector<string> vec;
    boost::regex rgx("[R]");
    boost::smatch match;

    boost::sregex_iterator begin {s.begin(), s.end(), rgx},
          end {};

    for (boost::sregex_iterator& i = begin; i != end; ++i)
    {
        boost::smatch m = *i;
        vec.push_back(m.str());
    }

    return vec;
}


int maint()
{
   vector<string> m = findMono("E:\501_Document_60_1_R.xml");
   if(m.size() > 0) cout << "Match" << endl;
   else cout << "No Match" << endl;
   return 0;
}

1 个答案:

答案 0 :(得分:2)

正如我们在评论中所讨论的那样,"_R"在技术上将根据您当前的数据集为您的正则表达式工作。

但是,我强烈考虑更复杂的事情,以避免在路径包含其他地方的序列"_R"时遇到问题。保护自己免受这个问题的影响相当容易,这是很好的一般做法,而且很可能会避免将来出现错误。

这是一个非常基本的工作示例:

#include <iostream>
#include <string>
#include <vector>

#include <boost/regex.hpp>

std::vector<std::string> findMono(const std::string& path)
{
  boost::regex rgx("_R");
  boost::sregex_iterator begin {path.begin(), path.end(), rgx}, end {};

  std::vector<std::string> matches;
  for (boost::sregex_iterator& i = begin; i != end; ++i) {
    matches.push_back((*i).str());
  }

  return matches;
}

int main(int argc, char * argv[])
{
  const std::string path = "E:\\501_Document_60_1_R.xml";
  const std::vector<std::string>& matches = findMono(path);

  for (const auto& match : matches) {
    std::cout << match << std::endl;
  }

  return 0;
}