【问题标题】:Using regex lookbehinds in C++11在 C++11 中使用正则表达式查找
【发布时间】:2013-01-26 16:02:45
【问题描述】:

为什么我不能在 C++11 中使用lookbehinds?前瞻工作正常。

std::regex e("(?<=a)b");

这将引发以下异常:

The expression contained mismatched ( and ).

这不会抛出任何异常:

std::regex e("a(?=b)");

我错过了什么?

【问题讨论】:

  • 如果您使用 gcc,请注意大部分 regex 的所有功能都尚未实现。
  • @Carlj901 您是如何设置工作环境的?您下载并安装了哪些软件?

标签: c++ regex c++11


【解决方案1】:

C++11 &lt;regex&gt; 使用 ECMAScript 的 (ECMA-262) 正则表达式语法,因此它不会具有后视功能(C++11 支持的其他正则表达式风格也没有有后视)。

如果您的用例需要使用look-behind,您可以考虑改用Boost.Regex

【讨论】:

  • 你知道 boost regex 是否支持它吗?
  • @Carlj901:快速的 Google 显示 boost 在 Perl 语法下支持向后查找。
【解决方案2】:

肯定的 lookbehind (?&lt;=a) 匹配字符串中紧跟在后向模式前面的位置。如果不希望出现重叠匹配,就像这里的情况一样,您可以简单地使用 capturing group 并仅提取第 1 组(如果您指定多个组,则可以提取更多组值):

a(b)

这是一种使用std::sregex_token_iterator提取所有匹配项的方法:

#include <iostream>
#include <vector>
#include <regex>

int main() {
    std::regex rx("a(b)");             // A pattern with a capturing group
    std::string sentence("abba abec"); // A test string
    std::vector<std::string> names(std::sregex_token_iterator(
        sentence.begin(), sentence.end(), rx, 1), // "1" makes it return Group 1 values
        std::sregex_token_iterator()
    );
    for( auto & p : names ) std::cout << p << std::endl; // Print matches
    return 0;
}

如果您只需要提取第一个匹配项,请使用regex_search(不是regex_match 作为此函数requires a full string match):

std::smatch sm;
if (regex_search(sentence, sm, rx)) {
    std::cout << sm[1] << std::endl;
}

请参阅C++ demo

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-09-17
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    • 1970-01-01
    • 2011-11-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多