繁体   English   中英

避免使用Regex_search的额外匹配

[英]Avoid extra matches from Regex_search

对c ++正则表达式库来说很新。

我们正试图解析一条线

*10 abc

我们想要将此行解析/拆分为两个令牌:

10
abc

我尝试过多种方法,比如regex_search,但我确实得到了3场比赛。 第一场比赛是全场比赛,第二场比赛是次序列比赛。 我的问题是

我们如何从上面的字符串中只获得两个匹配(10&abc)。 我尝试过的快照:

#include <regex>
#include <iostream>

int main() {
  const std::string t = "*10 abc";
  std::regex rgxx("\\*(\\d+)\\s+(.+)");
  std::smatch match;
  bool matched1 = std::regex_search(t.begin(), t.end(), match, rgxx);
  std::cout << "Matched size " << match.size() << std::endl;

  for(int i = 0 ; i < match.size(); ++i) {
    std::cout << i << " match " << match[i] << std::endl;
  }
}

输出:

Matched size 3
0 match *10 abc
1 match 10
2 match abc

0匹配是我不想要的。

我也愿意使用boost库/正则表达式。 谢谢。

您的代码本身并没有什么问题。 零匹配只是整个字符串,与正则表达式模式匹配。 如果您只想要两个捕获的术语,那么只需打印第一个和第二个捕获组:

const std::string t = "*10 abc";
std::regex rgxx("(\\d+)\\s+(.+)");
std::smatch match;
bool matched1 = std::regex_search(t.begin(), t.end(), match, rgxx);
std::cout << "Matched size " << match.size() << std::endl;

for (int i=1; i < match.size(); ++i) {
    std::cout << i << " match " << match[i] << std::endl;
}

Matched size 3
1 match 10
2 match abc

所以,这里的教训是匹配数组中的第一个条目(索引为零)将始终是整个字符串。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM