C++ Clang 无法解析此 Lookbehind Regex

C++ Clang Can't Parse this Lookbehind Regex

根据 regex101.com 和我称为 "RegExRx" 的应用程序,这是一个有效的正则表达式

(?<=\().*

也就是说,这应该匹配左括号字符后面的所有内容。以下是 regex101.com 对此的分析

/(?<=()./ (?<=() Positive Lookbehind - Assert that the regex below can be matched ( matches the character ( literally . matches any character (except newline) Quantifier: * Between zero and unlimited times, as many times as possible, giving back as needed [greedy]

然而,这个 C++11 程序抛出

libc++abi.dylib: terminating with uncaught exception of type std::__1::regex_error: The expression contained mismatched ( and ).

这是 Xcode 5.1.1.

附带的 Clang

问题:Clang 应该接受这个正则表达式吗?我怎样才能得到一个在语义上等同于这个的 std::regex?

#include <iostream>
#include <regex>

int main(int argc, const char * argv[])
{
    std::string x{ "(?<=\().*" };
    std::cout << "Here is my regex string " << x << std::endl;
    std::regex{ x }; // throws
    return 0;
}

编辑:我的问题与提议的重复问题不同,因为我问了 "How can I get a std::regex that is semantically equivalent to this one?" 下面的用户 hwnd 提供了非常有用的语义等效解决方法。

您正在使用的构造函数是:

explicit basic_regex( const CharT* s,
                      flag_type f = std::regex_constants::ECMAScript );

表示默认的正则表达式格式是 ECMAScript(或 javascript,正如我们大多数人所知。)

如果您将 regex101.com 中的正则表达式风格设置为 javascript 而不是 pcre,您将看到相同的错误:无法识别 (?,因此 ) 没有任何匹配项。

请注意 regex syntax types 中的 none 允许先行或后行。

C++11 使用ECMAScript 的正则表达式语法,不支持lookbehind。

上述正则表达式的等效项如下 —

\((.*)

注意: 捕获组 ( ... ) 保留左括号后的所有内容。

Working Demo