提升正则表达式匹配非空格和尖括号

时间:2013-08-13 16:56:00

标签: regex boost

我可能会问一个重复的问题,但我花了几个小时来搜索这个无济于事!

我正在尝试从我正在处理的程序解析的某些SIP URL中提取字符串。这是代码的摘录。我正在传递sipUrl,并且拥有所有正确的包括等等:

static const boost::regex sipRegExp ("(sip:\\S+?@(?=\\S)[^>]+);");
boost::cmatch result;
boost::match_results<string::const_iterator> results;
boost::match_flag_type flags = boost::format_perl;
string newSipUrl;
cout << sipUrl << endl;

bool toggle = boost::regex_search(sipUrl, result, sipRegExp, flags);
if (toggle) {
    cout << result[1].str() << endl;
    newSipUrl = result[1].str();
}

cout << "new url: " << newSipUrl << endl;

我基本上是尝试从sip:user@IP"\"alex@192.168.1.2\"<sip:alex@192.168.1.2>;tag=fe310852"这样的字符串中提取"\"bob\"<sip:bob@foo.com>;",但是,我无法匹配它!当我没有使用先行来尝试删除最后一个尖括号时,它工作得很好,但从那以后它就无法匹配。

在跑出门之前发布此信息,因此可能需要更多信息。如果有人能发现明显的东西,那那将是一个很大的帮助!请随时指出我可能错过的链接!

3 个答案:

答案 0 :(得分:2)

你有没有尝试过像regex这样简单的东西:

`sip:[a-zA-Z]*@[0-9a-zA-Z.]*`

在终端上工作但尚未尝试通过提升。如果您从简单的事情开始,然后逐点添加以使其更具体,那么将更容易跟踪正则表达式的哪个部分不起作用。

答案 1 :(得分:1)

你错过了分号前的>

"(sip:\\S+?@(?=\\S)[^>]+)>;"

虽然实际上你可能根本不需要分号。像斯科特的回答应该足够了。

答案 2 :(得分:0)

我最终修改了@David Knipe的评论 - 获胜的正则表达式是:

sip:\\S+@[^\\s>;]+

哪个匹配或不带尖括号,直到冒号。提供的两个答案都有效,但能够删除前瞻是非常好的。我还使用+修饰符来努力寻找有效的URI而不是空白的URI。

感谢您的帮助!