Viv*_*ndi 12 c++ regex linux c++11
我正在尝试使用正则表达式进行组匹配.我想从一个大字符串中提取两个字符串.
输入字符串看起来像这样:
t?B:Username!Username@Username.tcc.domain.com Connected
t?B:Username!Username@Username.tcc.domain.com WEBMSG #Username :this is a message
t?B:Username!Username@Username.tcc.domain.com Status: visible
Run Code Online (Sandbox Code Playgroud)
该Username可以是任何东西.同样适用于最终部分this is a message.
我想要做的是提取英镑符号后面的用户名#.不是来自字符串中的任何其他位置,因为它可以变化.我还想从分号后面的字符串中获取消息:.
我尝试使用以下正则表达式.但它永远不会输出任何结果.
regex rgx("WEBMSG #([a-zA-Z0-9]) :(.*?)");
smatch matches;
for(size_t i=0; i<matches.size(); ++i) {
cout << "MATCH: " << matches[i] << endl;
}
Run Code Online (Sandbox Code Playgroud)
我没有得到任何比赛.我的正则表达式出了什么问题?
Pra*_*ian 20
您的正则表达式不正确,因为捕获组都没有执行您想要的操作.第一个是匹配来自集合[a-zA-Z0-9]后面的<space>:单个字符,它适用于单个字符的用户名,但没有别的.第二个捕获组将始终为空,因为您正在查找零个或多个字符,但是指定匹配也不应该是贪婪的,这意味着零字符匹配是有效结果.
修复这两个你regex成为
std::regex rgx("WEBMSG #([a-zA-Z0-9]+) :(.*)");
Run Code Online (Sandbox Code Playgroud)
但是简单地实例化a regex和match_results对象不会产生匹配,您需要应用regex算法.由于您只想匹配输入字符串的一部分,因此在这种情况下使用适当的算法regex_search.
std::regex_search(s, matches, rgx);
Run Code Online (Sandbox Code Playgroud)
把它们放在一起
std::string s{R"(
t?B:Username!Username@Username.tcc.domain.com Connected
t?B:Username!Username@Username.tcc.domain.com WEBMSG #Username :this is a message
t?B:Username!Username@Username.tcc.domain.com Status: visible
)"};
std::regex rgx("WEBMSG #([a-zA-Z0-9]+) :(.*)");
std::smatch matches;
if(std::regex_search(s, matches, rgx)) {
std::cout << "Match found\n";
for (size_t i = 0; i < matches.size(); ++i) {
std::cout << i << ": '" << matches[i].str() << "'\n";
}
} else {
std::cout << "Match not found\n";
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
16380 次 |
| 最近记录: |