C ++使用Regex查找子串

时间:2017-12-21 16:14:07

标签: c++ regex

我有一个字符串测试

<td><a href="4.%20Functions,%20scope.ppt">4. Functions, scope.ppt</a></td>

我想找<a href="4.%20Functions,%20scope.ppt">(作为子字符串)

使用Dr.Google进行搜索:regex e ("<a href=.*?>"); cmatch =cm;标记我想要查找的子字符串。

接下来我该怎么做?

我是否正确使用regex_match(htmlString, cm, e); htmlString作为wchar_t*

2 个答案:

答案 0 :(得分:2)

如果你想找到 all 匹配的子串,那么你需要使用正则表达式迭代器:

// example data
std::wstring const html = LR"(

<td><a href="4.%20Functions,%20scope.ppt">4. Functions, scope.ppt</a></td>
<td><a href="4.%20Functions,%20scope.ppt">4. Functions, scope.ppt</a></td>
<td><a href="4.%20Functions,%20scope.ppt">4. Functions, scope.ppt</a></td>

)";

// for convenience
constexpr auto fast_n_loose = std::regex_constants::optimize|std::regex_constants::icase;

// extract href's
std::wregex const e_link{LR"~(href=(["'])(.*?)\1)~", fast_n_loose};

int main()
{
    // regex iterators       
    std::wsregex_iterator itr_end;
    std::wsregex_iterator itr{std::begin(html), std::end(html), e_link};

    // iterate through the matches
    for(; itr != itr_end; ++itr)
    {
        std::wcout << itr->str(2) << L'\n';
    }
}

答案 1 :(得分:1)

这将匹配完整的a代码,并获取 href 属性值,
在捕获组2中。

应该这样做,因为href属性可以在标签中的任何位置。

<a(?=(?:[^>"']|"[^"]*"|'[^']*')*?\shref\s*=\s*(?:(['"])([\S\s]*?)\1))\s+(?:"[\S\s]*?"|'[\S\s]*?'|[^>]*?)+>

您可以用[\w:}+代替a标签来获取所有标签中的 href

https://regex101.com/r/LHZXUM/1

Formatted and tested

 < a                    # a tag, substitute [\w:]+ for any tag

 (?=                    # Asserttion (a pseudo atomic group)
      (?: [^>"'] | " [^"]* " | ' [^']* ' )*?
      \s href \s* = \s* 
      (?:
           ( ['"] )               # (1), Quote
           ( [\S\s]*? )           # (2), href value
           \1 
      )
 )
 \s+ 
 (?: " [\S\s]*? " | ' [\S\s]*? ' | [^>]*? )+
 >