1.正则匹配URL中的IP地址,端口号和文件名
有个需求,要读取URL中的IP地址,端口号传给接口函数中,再获取文件名写入一下,网上没太找到合适的正则,而且发现,这种东西还是自己写舒服一些
C++的正则,如果出现匹配失败不会出现段错误,被小括号扩住的就会匹配,sm[0]就是重新打印一遍字符串
#include <iostream>
#include <string>
#include <regex>
using namespace std;
int main () {
string str ("http://10.10.114.152:2392/eciiwce/oiweoi/a.xml");
regex str_expr ("^http[s]?://([0-9.]*):(\\d*).*/(.*)$");
smatch sm;
regex_match (str,sm,str_expr);
if(regex_match ( str.cbegin(), str.cend(), sm, str_expr))
{
cout << "String:range, size:" << sm.size() << " matches\n";
for(int i=1;i<(int)sm.size();++i)///<这个0是整个字符串,从开始遍历是匹配全部的
cout<<sm[i]<<endl;
}
else
cout<<"not match"<<endl;
return 0;
}
2.一个匹配demo
匹配任意字符
现在的需求是,字符串长成这样,其中…和lll为非apple以为的任意字符串,需要获取apple后面的数字是多少,module name后面的字符串是什么
wekjweoifo
+++apple=23424 ......
module name:woeiwoei
lllllll
+++apple=23243 ...
module name:wefwfew
........
我写成了下面这样
("^[\\s\\S]*?apple = ([0-9]*)([\\s\\S]*?)module name: (.*?)[\\s\\S]*$")
讲解一下,^表示整个字符串的开头,其中[\\s\\S]*?
表示匹配任意字符若干次,那为啥不用.*
呢,因为后者不能匹配换行符,那*
后面为什么有?
,我用了懒惰。之前说GNU没有贪婪和懒惰,错了,如果不用懒惰,就会直接匹配到第6行的apple,即默认为贪婪。第二个括号其实没必要,获取的是23424后面一直到module name之间的字符,即…。第三个括号还是用的贪婪,这里就有问题了。因为我要循环匹配apple,我没找到更好的办法多次匹配apple,就通过正则重新执行一遍(.*?)
里面的内容。函数是这样的
while(regex_match ( str_dialdStatus.cbegin(), str_dialdStatus.cend(), sm, str_expr))
{
if(sm[2]!="unknown")///<module name后的判断条件
{
str_dialdStatus = sm[3];///<重新进行匹配
}
}