在C ++中重复子模式正则表达式

时间:2014-08-15 16:44:35

标签: c++ regex

我有一个输入...$1::integer,$2::varchar...,我正在尝试计算$\d::\w+模式的数量。所以,我有这个:

std::regex regex("(\\$\\d+\\:\\:\\w+(, ?){0,1})+?(\1)*?", std::regex_constants::icase);
std::match_results <const char *> matches;
std::regex_search(str.c_str(), matches, regex);

然而,这给出了结果:

$1::integer,$2::varchar

$2::varchar

如何更改模式以获取$1::integer$2::varchar作为匹配项?

2 个答案:

答案 0 :(得分:0)

你可以尝试

\$\d+::\w+(?=,|$)

以下是online demo并在regexstorm

进行了测试

enter image description here

模式说明:

  \$                       '$'
  \d+                      digits (0-9) (1 or more times)
  ::                       '::'
  \w+                      word characters (a-z, A-Z, 0-9, _) (1 or more times)
  (?=                      look ahead to see if there is:
    ,                        ','
   |                        OR
    $                        the end of the string/line
  )                        end of look-ahead

答案 1 :(得分:0)

好的,经过大量的实验和阅读后:

std::regex regex("\\$\\d+::\\w+");
auto els_begin = std::sregex_iterator(str.begin(), str.end(), regex);
auto els_end = std::sregex_iterator();
int matchCount = std::distance(els_begin, els_end);
for (std::sregex_iterator i = els_begin; i != els_end; ++i) 
{
    std::smatch match = *i;
    std::string match_str = match.str();
    // std::cout << match_str << '\n';
}