1

我想了解为什么当我尝试使用带有以下字符串的 BOOST 的 wsregex::compile 时我的程序崩溃:

(?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))?

在正则表达式伙伴中,一切似乎都很好。我在 RegexBuddy 上使用了 JGSoft 风格选项。

我正在验证以下内容:

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

你们能帮帮我吗。非常感谢。

4

1 回答 1

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 不喜欢这样。只需为您的捕获选择唯一的名称,您应该没问题。

于 2014-07-25T01:18:37.143 回答