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

换句话说,为 :

获取命名组

但我对 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;

C++ demo