c ++ std regexp为什么不匹配?

时间:2018-04-02 05:30:52

标签: c++ regex stl

我想获得关键字匹配长度

但是,始终匹配计数为零

为什么..?

->seeJson(['url' => ['Please enter a URL to shorten.'] ])

2 个答案:

答案 0 :(得分:0)

regex_match

  

确定正则表达式e是否匹配整个目标字符序列,可以指定为std :: string,C字符串或迭代器对。

您需要使用regex_search

  

确定正则表达式e与目标字符序列中的某个子序列之间是否匹配。

此外,您可以使用regex_iterator,例如来自here

string text = "sp_call('%1','%2','%a');";
std::regex regexp("%[0-9]");

auto words_begin =
    std::sregex_iterator(text.begin(), text.end(), regexp);
auto words_end = std::sregex_iterator();

std::cout << "Found "
    << std::distance(words_begin, words_end)
    << " words:\n";

for (std::sregex_iterator i = words_begin; i != words_end; ++i) {
    std::smatch match = *i;
    std::string match_str = match.str();
    std::cout << match_str << '\n';
}
  

找到2个字:
  %1
  %2

答案 1 :(得分:0)

您需要检查函数调用std::regex_match(text, m, regexp)

的返回值

根据中的文档 http://en.cppreference.com/w/cpp/regex/regex_match 很明显,它返回一个布尔值 -

  

如果匹配,则返回 true ,否则返回 false 在任何一种情况下,   对象m已更新

所以你需要在你的代码中添加检查。

#include <iostream>
#include <regex>

int main()
{
    std::string text = "sp_call('%1','%2','%a');";
    std::regex regexp("%[0-9]");
    std::smatch m;
    bool match_found = std::regex_match(text, m, regexp); // capture the return value
    if (match_found) // test it
    {
        int length = m.size();
        std::cout << text.c_str() << " matched " << length << std::endl;
    }
    else
    {
        std::cout << "No match found" << std::endl;
    }
    return 0;
}