C++11 正则表达式混淆
C++11 regex confusion
我有一个 python 正则表达式:
\A\s* # optional whitespace at the start, then
(?P<sign>[-+]?) # an optional sign, then
(?=\d|\.\d) # lookahead for digit or .digit
(?P<num>\d*) # numerator (possibly empty)
(?: # followed by
(?:/(?P<denom>\d+))? # an optional denominator
| # or
(?:\.(?P<decimal>\d*))? # an optional fractional part
(?:E(?P<exp>[-+]?\d+))? # and optional exponent
)
\s*\Z # and optional whitespace to finish
换句话说,为 :
获取命名组
- signed/unsigned | rational/decimal/integer |编号 | with/without 指数
但我对 C++11 正则表达式格式感到困惑?正如我所读,支持的格式很少,但我得到了一个正则表达式解析器异常。此外,我读到 C++11 正则表达式不支持命名组。
如何拥有提供等效方案的 C++11 兼容正则表达式?
非常感谢您的帮助。
您不能保留命名的捕获组,但您可以使用多行字符串文字以详细的方式定义模式:
std::string pat = "^\s*" // optional whitespace at the start, then
"([-+]?)" // an optional sign, then
"(?=\.?\d)" // lookahead for digit or .digit
"(\d*)" // numerator (possibly empty)
"(?:" // followed by
"(?:/(\d+))?" // an optional denominator
"|" // or
"(?:\.(\d*))?" // an optional fractional part
"(?:E([-+]?\d+))?" // and optional exponent
")"
"\s*$"; // and optional whitespace to finish
std::regex e(pat);
std::string s(" -23/34 ");
std::smatch a;
if (std::regex_search(s, a, e))
std::cout << a[0] << endl;
我有一个 python 正则表达式:
\A\s* # optional whitespace at the start, then
(?P<sign>[-+]?) # an optional sign, then
(?=\d|\.\d) # lookahead for digit or .digit
(?P<num>\d*) # numerator (possibly empty)
(?: # followed by
(?:/(?P<denom>\d+))? # an optional denominator
| # or
(?:\.(?P<decimal>\d*))? # an optional fractional part
(?:E(?P<exp>[-+]?\d+))? # and optional exponent
)
\s*\Z # and optional whitespace to finish
换句话说,为 :
获取命名组- signed/unsigned | rational/decimal/integer |编号 | with/without 指数
但我对 C++11 正则表达式格式感到困惑?正如我所读,支持的格式很少,但我得到了一个正则表达式解析器异常。此外,我读到 C++11 正则表达式不支持命名组。
如何拥有提供等效方案的 C++11 兼容正则表达式?
非常感谢您的帮助。
您不能保留命名的捕获组,但您可以使用多行字符串文字以详细的方式定义模式:
std::string pat = "^\s*" // optional whitespace at the start, then
"([-+]?)" // an optional sign, then
"(?=\.?\d)" // lookahead for digit or .digit
"(\d*)" // numerator (possibly empty)
"(?:" // followed by
"(?:/(\d+))?" // an optional denominator
"|" // or
"(?:\.(\d*))?" // an optional fractional part
"(?:E([-+]?\d+))?" // and optional exponent
")"
"\s*$"; // and optional whitespace to finish
std::regex e(pat);
std::string s(" -23/34 ");
std::smatch a;
if (std::regex_search(s, a, e))
std::cout << a[0] << endl;