wsregex :: compile падает (утечка памяти) при обработке строки регулярного выражения?

Я хотел бы понять, почему моя программа падает, когда я пытаюсь использовать wsregex :: compile из BOOST со следующей строкой:

(?P<path>\b[a-z]:\\(?:[^\\/:*?"<>|\r\n]+\\)*[^\\/:*?"<>|\r\n]*)?
(:)?
(?P<ip>(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b)
(;(?P<port>\d*))?
(:(?P<port>\b\d+\b):(?P<password>[\w]*))?
(:(?P<password>\b\d+\b))?

В regex buddy все вроде бы хорошо. Я использовал опцию JGSoft на RegexBuddy.

Я проверяю следующее:

c:\My Documents\Test\test.csv:1.12.12.13:111:admin
c:\My Documents\Test\test.csv:1.12.12.13:111
c:\My Documents\Test\test.csv:1.12.12.13;111
1.12.12.13:111
1.12.12.13;111

Можете ли вы, ребята, помочь мне. Большое спасибо.

1

Решение

Насколько я могу судить, это не утечка памяти и не сбой. Xpressive вызывает исключение, потому что это недопустимый шаблон. Следующая программа:

#include <iostream>
#include <boost/xpressive/xpressive_dynamic.hpp>

namespace xpr = boost::xpressive;

int main()
{
const char pattern[] =
"(?P<path>\\b[a-z]:\\\\(?:[^\\\\/:*?\"<>|\\r\\n]+\\\\)*[^\\\\/:*?\"<>|\\r\\n]*)?""(:)?""(?P<ip>(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\b)""(;(?P<port>\\d*))?""(:(?P<port>\\b\\d+\\b):(?P<password>[\\w]*))?""(:(?P<password>\\b\\d+\\b))?";
try
{
xpr::sregex rx = xpr::sregex::compile(pattern);
}
catch(xpr::regex_error const & e)
{
std::cout << e.what() << std::endl;
}
}

Выходы:

named mark already exists

Действительно, это так. Этот шаблон использует «порт» и «пароль» дважды в качестве имени группы захвата. Xpressive это не нравится. Просто выберите уникальные имена для ваших снимков, и все будет хорошо.

1

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


По вопросам рекламы [email protected]