我正在尝试使用正则expression式进行组匹配。 我想从一个大string中提取两个string。
inputstring如下所示:
tХB:[email protected] Connected tХB:[email protected] WEBMSG #Username :this is a message tХB:[email protected] Status: visible
Username可以是任何东西。 this is a message的最后部分。
我想要做的是提取井号#后面的用户名 。 不是从string中的任何其他地方,因为它可以改变。 我也想从分号后面的string中得到消息 : 。
如何根据开始和结束位置来查找和replacestring
batch file集/ pexpression式
Linux CLI更改价格(awk或sed?)
bash正则expression式在linux上工作,但不是solaris
我试图用下面的正则expression式。 但它从来没有输出任何结果。
regex rgx("WEBMSG #([a-zA-Z0-9]) :(.*?)"); smatch matches; for(size_t i=0; i<matches.size(); ++i) { cout << "MATCH: " << matches[i] << endl; }
我没有得到任何比赛。 我的正则expression式有什么问题?
有没有办法将date转换为Perl 5.8之前的时代?
Perl正则expression式 d +和运算符在字母数字string中只显示一位数字
Sed:如何replace特定模式位于文件中后发现的string
如何将多个文件名中的零件从1更改为01?
您的正则表达式不正确,因为这两个捕获组都不做你想要的。 首先是匹配从集合[a-zA-Z0-9]后跟<space>:的单个字符,它适用于单个字符用户名,但没有别的。 第二个捕获组将始终为空,因为您正在查找零个或多个字符,而且指定匹配不应该是贪婪的,这意味着零个字符匹配是一个有效的结果。
解决这两个你的regex成为
std::regex rgx("WEBMSG #([a-zA-Z0-9]+) :(.*)");
但是简单地实例化一个regex和一个match_results对象不会产生匹配,你需要应用一个regex算法。 既然你只想匹配输入字符串的一部分,在这种情况下使用适当的算法是regex_search 。
std::regex_search(s,matches,rgx);
把它放在一起
std::string s{R"( tХB:[email protected] Connected tХB:[email protected] WEBMSG #Username :this is a message tХB:[email protected] Status: visible )"}; std::regex rgx("WEBMSG #([a-zA-Z0-9]+) :(.*)"); std::smatch matches; if(std::regex_search(s,rgx)) { std::cout << "Match foundn"; for (size_t i = 0; i < matches.size(); ++i) { std::cout << i << ": '" << matches[i].str() << "'n"; } } else { std::cout << "Match not foundn"; }
现场演示
"WEBMSG #([a-zA-Z0-9]) :(.*?)" :这个正则表达式只会匹配包含1个字符长度的用户名和分号后的任何消息的字符串,而第二个组将总是空的,因为试图找到任何字符从0到无限的非贪婪匹配。
"WEBMSG #([a-zA-Z0-9]+) :(.*)"应该工作。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。