2016-07-21 10 views
3

を構築することができないのですhttps://regex101.com/r/gD2eN7/1なぜ私はこの正規表現を書いたこの正規表現

しかし、私はC++私は、ランタイムエラーを取得し、それを構築しようとします。 temp2.​​exeで0x7714C52Fで

未処理の例外:マイクロソフトC++の例外:メモリ位置0x003BF2ECで
のstd :: regex_error。

const auto input = "if (KnR)\n\tfoo();\nif (spaces) {\n foo();\n}\nif (allman)\n{\n\tfoo();\n}\nif (horstmann)\n{\tfoo();\n}\nif (pico)\n{\tfoo(); }\nif (whitesmiths)\n\t{\n\tfoo();\n\t}"s; 

cout << input << endl; 

cout << regex_replace(input, regex("(.+?)\\s*{?\\s*(.+?;)\\s*}?\\s*"), "$1 {\n\t$2\n}\n") << endl; 

Live Example

私はC++がサポートされていない機能を使用していますか?

+1

あなたの正規表現には "生の文字列リテラル"を使うことをお勧めします。これはあなたを "エスケープなもの"から守り、コードを読みやすくします。また、単にリンクを提供するのではなく、コードやエラーなどを直接質問に含めてください。リンクが古くなって消滅し、患者(無料)のレビュー担当者に余計な障壁(多くの作業)が導入されます。私たちは私たちがしなければならないよりも頑張ってはいけません。 –

+0

C++ Shellはエラーを起こしません(http://cpp.sh/7bue)。 –

+3

中括弧をエスケープする: 'regex_replace(input、regex(" + ")\\ s * \\ {?\\ s *(?+?))\\ s * \\}?\\ s * )、 "$ 1 {\ n \ t $ 2 \ n} \ n") ' - http://ideone.com/jlH6QS –

答えて

4

中括弧をエスケープする必要があります。それは正規表現式の中でその特別な意味を解釈することなく、あるとして

\character
文字文字std::regex ECMAScript flavor referenceを参照してください。 文字は、上記の特殊文字シーケンスのいずれかを形成するものを除いてエスケープすることができます。以下のために必要な
^$\.*+?()[]{}|

regex_replace(input, regex("(.+?)\\s*\\{?\\s*(.+?;)\\s*\\}?\\s*"), "$1 {\n\t$2\n}\n") 

ここIDEONE demo

#include <iostream> 
#include <regex> 
#include <string> 

using namespace std; 

int main() { 
    const auto input = "if (KnR)\n\tfoo();\nif (spaces) {\n foo();\n}\nif (allman)\n{\n\tfoo();\n}\nif (horstmann)\n{\tfoo();\n}\nif (pico)\n{\tfoo(); }\nif (whitesmiths)\n\t{\n\tfoo();\n\t}"s; 

    cout << regex_replace(input, regex("(.+?)\\s*\\{?\\s*(.+?;)\\s*\\}?\\s*"), "$1 {\n\t$2\n}\n") << endl; 
    //           ^^    ^^ 
} 
です
+0

エスケープしないと、ランタイムエラーが発生しました。 –

+0

私は今はデバッグできませんが、ECMAScriptが 'std :: regex'に実装されている方法に関連したものでなければなりません。 JavaScriptでは、JS正規表現エンジンは数値を囲まない '{'と '} 'が限定的なものではないことを知っているので問題はありません。ここでは、この推測メカニズムに欠陥があると私は信じています。実際には、JavaScriptで正規表現をデバッグすることはできず、 'std :: regex' ECMAScriptパターンで動作することを確認してください。 –

関連する問題