我想知道是否有人可以帮助我,我一直在寻找正则表达式的例子,但我仍然无法理解它。
字符串看起来像这样:
“用户JaneDoe,IP:12.34.56.78”
“用户John Doe,IP:34.56.78.90”
我将如何创建一个与上述字符串匹配的表达式?
答案 0 :(得分:4)
问题是你想要如何匹配这些,以及你想要排除什么?
将任何传入字符串与简单.*
匹配是微不足道的(但很少有用)。
为了更准确地匹配这些(并添加提取用户名和/或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地址,但是(几乎没有)足够不同的格式可以清楚地表明它匹配并打印出单个部分,而不仅仅是传递整个字符串。
答案 1 :(得分:3)
#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;
}
编辑:修正了字符串中缺少的逗号,由Davka指出,并将cmatch更改为smatch