Regex boost正则表达式匹配非空格和尖括号

Regex boost正则表达式匹配非空格和尖括号,regex,boost,Regex,Boost,我可能会问一个重复的问题,但我已经花了几个小时在谷歌上搜索了这个问题,但没有用 我试图从我正在使用的程序解析的一些SIPURL中提取一个字符串。下面是代码的摘录。我正在传递sipUrl,并拥有所有权利,包括: static const boost::regex sipRegExp ("(sip:\\S+?@(?=\\S)[^>]+);"); boost::cmatch result; boost::match_results<string::const_iterator> re

我可能会问一个重复的问题,但我已经花了几个小时在谷歌上搜索了这个问题,但没有用

我试图从我正在使用的程序解析的一些SIPURL中提取一个字符串。下面是代码的摘录。我正在传递
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;
static const boost::regex sipRegExp(“(sip:\\S+?@(?=\\S)[^>]+);”;
boost::cmatch结果;
匹配结果;
boost::match\u flag\u type flags=boost::format\u perl;
字符串newSipUrl;

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

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

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

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

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

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

您错过了分号之前的

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

虽然实际上你可能根本不需要分号。类似Scott的答案就足够了。

您错过了分号之前的

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

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

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

sip:\\S+@[^\\s>;]+
它匹配有或没有尖括号,直到冒号。两个答案都很有效,但是能够移除前瞻性是非常好的。我还使用了
+
修饰符,努力找到一个有效的URI,而不是一个空白的URI


谢谢你的帮助

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

sip:\\S+@[^\\s>;]+
它匹配有或没有尖括号,直到冒号。两个答案都很有效,但是能够移除前瞻性是非常好的。我还使用了
+
修饰符,努力找到一个有效的URI,而不是一个空白的URI


谢谢你的帮助

字符类可以处理更多的字符。我会说,
“sip:[-\u0-9a-zA-Z]*@[-\u0-9a-zA-Z.]*”
至少。甚至可能只是
“sip:\\S*@[^\\S>]*”
。字符类可以使用更多字符。我会说,
“sip:[-\u0-9a-zA-Z]*@[-\u0-9a-zA-Z.]*”
至少。或者甚至可能只是
“sip:\\S*@[^\\S>]*”