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。
上述正则表达式的等效项如下 —
\((.*)
注意: 捕获组 ( ... )
保留左括号后的所有内容。
根据 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。
上述正则表达式的等效项如下 —
\((.*)
注意: 捕获组 ( ... )
保留左括号后的所有内容。