0

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

我正在尝试从我正在处理的程序解析的一些 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;

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

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

4

3 回答 3

2

您是否尝试过一些更简单的方法,例如正则表达式:

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

在终端上工作,但还没有通过 boost 尝试过。如果您从简单的东西开始,然后一点一点地添加以使其更具体,那么跟踪正则表达式的哪个部分不起作用会更容易。

于 2013-08-13T17:39:52.867 回答
1

你错过了>分号之前的:

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

尽管实际上您可能根本不需要分号。像斯科特的答案应该就足够了。

于 2013-08-13T22:11:39.040 回答
0

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

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

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

谢谢您的帮助!

于 2013-08-14T09:36:44.107 回答