学习一下C++ 正则表达式的使用。
int main()
{
string s = "123abc456def789ghi";
regex r("[0-9]{3}");
string::const_iterator iterStart = s.begin();
string::const_iterator iterEnd = s.end();
smatch result;
while (regex_search(iterStart, iterEnd, result, r))
{
cout << result[0] << endl;
iterStart = result[0].second;
}
return 0;
}
输出的结果是123 456 789 代码很简单,一看就懂。
但是我对result[0].second产生了一点点疑问,究竟这个指针指到了哪里?
我对s加了一点点东西。
int main()
{
string s = "123666abc456def789ghi";
regex r("[0-9]{3}");
string::const_iterator iterStart = s.begin();
string::const_iterator iterEnd = s.end();
smatch result;
while (regex_search(iterStart, iterEnd, result, r))
{
cout << result[0] << endl;
iterStart = result[0].second;
}
return 0;
}
输出结果123 666 456 789显然是指向了第一个匹配到的字符串的后面一个字符。
PS:这里iteraStart和iterEnd不能使用auto去声明。反正就是这么一个匹配的方法,不使用循环,匹配到第一个符合的就停止了。
顺道对regex_match也看了看。
这个本身没有什么好说的,是全文匹配,即要求整个字符串符合匹配规则。
我对匹配的结果产生了好奇。
int main()
{
string s = "123abc456def789ghi";
regex r("[0-9]{3}");
smatch result;
regex_match(s,result,r);
cout << result.size() << endl;
return 0;
}
首先,这个结果输出是0。我就在想这个函数有什么用呢?难道只能看整个字符串和匹配串是不是匹配吗?是不是有点鸡肋了。
又去网上看了看,原来是这样。
int main()
{
string s = "123abc";
regex r("([0-9]{3})([a-z]*)");
smatch result;
regex_match(s,result,r);
cout << result.size() << endl;
cout << result.str() << endl;
cout << result.str(0) << endl;
cout << result.str(1) << endl;
cout << result.str(2) << endl;
return 0;
}
输出的结果是123abc 123abc 123 abc
()在这里好像是分组的意思,最后按分组的输出。的确有点鸡肋。
反正就记住,如果是判断字符串符不符合那个规则就使用match,要是解析字符串获取日期数字什么的就用search。
----------------------------------------------分割线----------------------------------------------------------------------------
下面看一道题,实现 一个函数判断字符串是否表示数值。
用正则表达式太合适了。
数值字符串遵循模式A[.[B]][e|EC]或者.B[e|EC]
ABC都是数字的意思。e、E是指数的那个符号
经过很多次尝试。。。
int main()
{
string s = "12e+5.3";
regex r("[\+,-]?(0|([1-9][0-9]*))(.[0-9]+)?([e,E][\+,-]([1-9][0-9]*))?");
cout << regex_match(s, r)<< endl;
return 0;
}
经过测试+100 5e2 -123 3.1416 -1E-16均输出1
12e 1a3.14 1.2.3 +-5 12e+5.4均输出0
这就是一点一点凑出来的。。。
[\+,-]?(0|([1-9][0-9]*))(.[0-9]+)?这表示带正负号(或者不带)的数字
[e,E]这个是跟个E
[\+,-]([1-9][0-9]*这是带正负号(或者不带)的整数
([e,E][\+,-]([1-9][0-9]*))?这表示有没有指数都可以。
我对于|这个符号也产生了一些 疑问。究竟顺序是什么样的?
but,我并不想去了解,遇事不决就加小括号,保准运算顺序不会错。
完美,告辞。