我想知道是否有人可以帮助我,我一直在寻找正则表达式示例,但我仍然无法理解它。
字符串如下所示:
“用户 JaneDoe,IP:12.34.56.78”
“用户 JohnDoe,IP:34.56.78.90”
我将如何制作与上述字符串匹配的表达式?
我想知道是否有人可以帮助我,我一直在寻找正则表达式示例,但我仍然无法理解它。
字符串如下所示:
“用户 JaneDoe,IP:12.34.56.78”
“用户 JohnDoe,IP:34.56.78.90”
我将如何制作与上述字符串匹配的表达式?
问题是您究竟想如何匹配这些,以及您还想排除什么?
将任何传入的字符串与简单的.*
.
为了更准确地匹配这些(并增加提取用户名和/或 IP 等内容的可能性),您可以使用类似:"User ([^,]*), IP: (\\d{1,3}(\\.\\d{1,3}){3})"
. 根据您的输入,这可能仍会遇到名称包含逗号的问题(例如,“John James, Jr.”)。如果你不得不考虑到这一点,它很快就会变得相当丑陋。
编辑:这里有一些代码来测试/演示上面的正则表达式。目前,这是使用 C++0x 正则表达式类 - 要使用 Boost,您需要稍微更改命名空间(但我相信这应该是全部)。
#include <regex>
#include <iostream>
void show_match(std::string const &s, std::regex const &r) {
std::smatch match;
if (std::regex_search(s, match, r))
std::cout << "User Name: \"" << match[1]
<< "\", IP Address: \"" << match[2] << "\"\n";
else
std::cerr << s << "did not match\n";
}
int main(){
std::string inputs[] = {
std::string("User JaneDoe, IP: 12.34.56.78"),
std::string("User JohnDoe, IP: 34.56.78.90")
};
std::regex pattern("User ([^,]*), IP: (\\d{1,3}(\\.\\d{1,3}){3})");
for (int i=0; i<2; i++)
show_match(inputs[i], pattern);
return 0;
}
这会打印出用户名和 IP 地址,但以(几乎没有)不同的格式来清楚地表明它正在匹配并打印出各个部分,而不仅仅是传递整个字符串。
#include <string>
#include <iostream>
#include <boost/regex.hpp>
int main() {
std::string text = "User JohnDoe, IP: 121.1.55.86";
boost::regex expr ("User ([^,]*), IP: (\\d{1,3}(\\.\\d{1,3}){3})");
boost::smatch matches;
try
{
if (boost::regex_match(text, matches, expr)) {
std::cout << matches.size() << std::endl;
for (int i = 1; i < matches.size(); i++) {
std::string match (matches[i].first, matches[i].second);
std::cout << "matches[" << i << "] = " << match << std::endl;
}
}
else {
std::cout << "\"" << expr << "\" does not match \"" << text << "\". matches size(" << matches.size() << ")" << std::endl;
}
}
catch (boost::regex_error& e)
{
std::cout << "Error: " << e.what() << std::endl;
}
return 0;
}
Edited: Fixed missing comma in string, pointed out by Davka, and changed cmatch to smatch