2017-03-21 14 views
1

私はPythonの正規表現しました:つまりC++ 11の正規表現の混乱

\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対応の正規表現を持つにはどうすればよいですか?

ありがとうございました。

答えて

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++ demo

+0

あなたの岩を参照してください。情報については、ここで使用する正規表現のスタイルは何ですか? posix? –

+1

いいえ、ECMAScript 5です。POSIXは先読みをサポートしていません。ここには '(?= \\。?\\ d)'があります。 –