ECMAScript Regex для многослойной строки

Я пишу процедуру загрузки для моего приложения, и она включает в себя чтение данных из файла и создание соответствующего объекта с соответствующими свойствами.

Файл состоит из последовательных записей (разделенных новой строкой) в следующем формате:

=== OBJECT TYPE ===
<Property 1>: Value1
<Property 2>: Value2
=== END OBJECT TYPE ===

Где значения часто являются строками, которые могут состоять из произвольных символов, новых строк и т. Д.

Я хочу создать std::regex который может соответствовать этому формату и разрешить мне использовать std::regex_iterator читать каждый из объектов в файл по очереди.

Однако у меня возникли проблемы с созданием регулярного выражения, соответствующего этому формату; Я посмотрел на синтаксис ECMAScript и создал свое регулярное выражение следующим образом, но он не совпадает со строкой в ​​моем тестовом приложении:

const std::regex regexTest( "=== ([^=]+) ===\\n([.\\n]*)\\n=== END \\1 ===" );

И при использовании этого в следующем тестовом приложении оно не может сопоставить регулярное выражение со строкой:

int main()
{
std::string testString = "=== TEST ===\n<Random Example>:This is a =test=\n<Another Example>:Another Test||\n=== END TEST ===";

std::cout << testString << std::endl;

const std::regex regexTest( "=== ([^=]+) ===\\n([.\\n]*)\\n=== END \\1 ===" );
std::smatch regexMatch;

if( std::regex_match( testString, regexMatch, regexTest ) )
{
std::cout << "Prefix: \"" << regexMatch[1] << "\"" << std::endl;
std::cout << "Main Body: \"" << regexMatch[2] << "\"" << std::endl;
}

return 0;
}

0

Решение

Ваша проблема гораздо проще, чем кажется. Это:

const std::regex regexTest( "=== ([^=]+) ===\\n((?:.|\\n)*)\\n=== END \\1 ===" );

отлично работал на clang ++ / libc ++. Кажется, что \n не вписывается в [] скобки в регулярном выражении ECMA. Не забудьте использовать while regex_search вместо if regex_match если вы хотите найти более одного экземпляра регулярного выражения внутри строки!

1

Другие решения

Попробуй использовать:

  1. ленивые квантификаторы:

    === (.+?) ===\\n([\\s\\S]*?)\\n=== END \\1 ===

  2. отрицательные классы и отрицательные взгляды:

    === ((?:[^ ]+| (?!===))+) ===\\n((?:[^\\n]+|\\n(?!=== END \\1 ===))*)

  3. POSIX:

    === (.+?) ===\n((.|\n)*?)\n=== END [^=]+? ===

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector