Я пишу процедуру загрузки для моего приложения, и она включает в себя чтение данных из файла и создание соответствующего объекта с соответствующими свойствами.
Файл состоит из последовательных записей (разделенных новой строкой) в следующем формате:
=== 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;
}
Ваша проблема гораздо проще, чем кажется. Это:
const std::regex regexTest( "=== ([^=]+) ===\\n((?:.|\\n)*)\\n=== END \\1 ===" );
отлично работал на clang ++ / libc ++. Кажется, что \n
не вписывается в []
скобки в регулярном выражении ECMA. Не забудьте использовать while regex_search
вместо if regex_match
если вы хотите найти более одного экземпляра регулярного выражения внутри строки!
Попробуй использовать:
ленивые квантификаторы:
=== (.+?) ===\\n([\\s\\S]*?)\\n=== END \\1 ===
отрицательные классы и отрицательные взгляды:
=== ((?:[^ ]+| (?!===))+) ===\\n((?:[^\\n]+|\\n(?!=== END \\1 ===))*)
POSIX:
=== (.+?) ===\n((.|\n)*?)\n=== END [^=]+? ===