[英]Regular Expression iterator is not working in Cpp
我在Visual Studio 2010上使用C ++(我不认为它的v11标准,但我没有检查)。
我试图用以下代码提取tracert的IP地址:
#include <iomanip>
#include <iostream>
#include <string>
#include <regex>
using namespace std;
typedef regex_iterator<string::iterator> regexp;
#define MAX_BUFFER 255
int main() {
string out;
char buffer[MAX_BUFFER];
smatch m;
regex e(" 1.+\\[(.+)\\]");
FILE *stream = _popen("tracert SOMEHOSTNAME", "r");
while ( fgets(buffer, MAX_BUFFER, stream) != NULL ) {
out = buffer;
regexp rit (out.begin(), out.end(), e);
regexp rend;
while (rit != rend) {
cout << rit->str() << endl;
++rit;
}
}
_pclose(stream);
cout << "Done.";
cin >> buffer;
}
但是,正则表达式并没有提取出组本身。 相反,它只是吐出全线!
我以为我非常仔细地遵循了例子,但似乎我没有正确使用regex_iterator。
1 - 如何最好地从此字符串中提取IP
(附带问题 - 是否有一个C ++函数将进入网络并从主机名获取IP就像跟踪我们的品脱?另一个将获得mac地址就像arp -a一样)
我没有MSVC,GNU已经破坏了std :: regex支持,所以我在这里玩过'boost :: regex':
regex e("^\\s*1\\s.*?\\[(.*?)\\]");
请注意:
1
字符(因此它不会匹配线开始13
,例如) #include <iostream>
#include <string>
#include <boost/regex.hpp>
using namespace std;
using boost::regex;
using boost::regex_iterator;
#define MAX_BUFFER 255
int main()
{
char buffer[MAX_BUFFER];
regex e("^\\s*1\\s.*?\\[(.*?)\\]");
FILE *stream = popen("cat input.txt", "r");
while(fgets(buffer, MAX_BUFFER, stream) != NULL)
{
typedef regex_iterator<string::iterator> regit;
string out = buffer;
regit rit(out.begin(), out.end(), e);
regit rend;
while(rit != rend)
{
cout << (*rit)[1].str() << endl;
++rit;
}
}
pclose(stream);
cout << "Done.\n";
}
这似乎适用于input.txt
:
Tracing route to 11.1.0.1 over a maximum of 30 hops
1 2 ms 3 ms 2 ms [157.54.48.1]
2 75 ms 83 ms 88 ms [11.1.0.67]
3 73 ms 79 ms 93 ms [11.1.0.1]
Trace complete.
打印:
157.54.48.1
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.