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

find pattern in string regular expression c++

本文关键字:查找 模式 c++ 字符串 正则表达式      更新时间:2023-10-16

我有以下字符串: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;
}

正如我们在评论中所讨论的,在给定当前数据集的情况下,"_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;
}