C++ 正则表达式的一些探索

6 篇文章 0 订阅
1 篇文章 0 订阅

学习一下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,我并不想去了解,遇事不决就加小括号,保准运算顺序不会错。

完美,告辞。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值