我可能会问一个重复的问题,但我花了几个小时来搜索这个无济于事!
我正在尝试从我正在处理的程序解析的某些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>;"
,但是,我无法匹配它!当我没有使用先行来尝试删除最后一个尖括号时,它工作得很好,但从那以后它就无法匹配。
在跑出门之前发布此信息,因此可能需要更多信息。如果有人能发现明显的东西,那那将是一个很大的帮助!请随时指出我可能错过的链接!
答案 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。
感谢您的帮助!