2016-07-21 6 views
3

Я написал это регулярное выражение:Почему я не в состоянии построить этот Regex

(.+?)\s*{?\s*(.+?;)\s*}?\s* 

какие тесты отлично: https://regex101.com/r/gD2eN7/1

Но когда я пытаюсь построить его в C++ я получаю во время выполнения ошибок.

Необработанное исключение в 0x7714C52F в temp2.exe: Microsoft C++ исключение:
станд :: regex_error в ячейку памяти 0x003BF2EC.

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

Вам нужно избегать фигурных скобок. Смотрите std::regex ECMAScript flavor reference:

\character
Персонаж характер как она есть, без интерпретации его особого значения в регулярном выражении. Любой символ может быть экранирован, кроме тех, которые образуют какую-либо из специальных последовательностей символов выше.
Необходим для: ^$\.*+?()[]{}|

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 и быть уверенным, что оно будет работать с шаблоном ECmAScript 'std :: regex'. –