1

我有一个 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 兼容正则表达式?

非常感谢您的帮助。

4

1 回答 1

1

您不能保留命名的捕获组,但可以使用多行字符串文字以详细的方式定义模式:

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++ 演示

于 2017-03-21T19:49:13.423 回答