C++ regular expression, study notes

这篇博客详细记录了C++中正则表达式的使用和理解,包括基础语法、匹配模式以及在实际编程中的应用实例。

The first note:

/*regular experssion grammars:
ECMAScript最powerful,也是下面用的
basic
extended
awk
grep
egrep
*/
#include<regex>
#include<iostream>
using namespace std;
int main(){//基本查找匹配
	string t;
	while(1){
		cin>>t;
	try {// http://www.cplusplus.com/reference/regex/ECMAScript规范的连接地址
//		regex e("ab"); //表示只匹配ab
//		regex e("ab.",regex_constants::icase);//. 表示后面只能是一个字符,除了空行  ,icase可以忽略大小写
//      regex e("abc?"); //?表示最后一个字符,可以有可无
//		regex e("abc*");//*表示最后一个字符可有可无,并且后面可以接无数个字符
//		regex e("abc+");//+ 表示最后一个字符必须有,并且最后一个字符可以重复出现
//		regex e("abc[def]");//[]  表示括号内的字符,只能选一个,并且不能不选
//		regex e("abc[def]*");//表示只能“ 匹配abc,然后后一位必须从[]中选或者abc后面直接为0,再后面的字符就不限制
//		regex e("abc[^def]*");//正好相反,表示[]内不能匹配
//		regex e("abc[abc]{5}");//{} 表示后面有几位字符。这里的意思是abc后面的5位字符必须从[]选
//		regex e("abc|yuan[fang]");// | 是或的意思。 这里abc, 或者yuan[fang], 
//		regex e("abc|yuan[fang\]]");//\]可以用转义字符 
//		regex e("(abc)de+(yuan)\\1\\2");//()表示一个组,后面\\1,\\2表示第组。 这里匹配上的例子为:abcdee...eeyuanabcyuan
		//regex e("[[:w:]]+@[[:w:]]+.com");//匹配邮箱, [[:w:]] 是word character:digital,number,or underscore
		   //http://www.cplusplus.com/reference/regex/ECMAScript规范的连接地址

		//bool match = regex_match(t,e);//这里是匹配整个的字符串

		//regex e("ab.",regex_constants::icase);//. 表示后面只能是一个字符,除了空行  ,icase可以忽略大小写
		//regex e("^ab.",regex_constants::icase);//^ 这里会搜索,ab是字符串的开头
		regex e("ab.$",regex_constants::icase);//$ 这里会搜索,ab是字符串的结尾
		bool match = regex_search(t, e); //是匹配子字符串
		cout<<(match?"Matched":"Unmatched")<<endl;
    } 
 
    catch (const std::regex_error& e) {
        std::cout << "regex_error caught: " << e.what() << '\n';
        if (e.code() == std::regex_constants::error_brack) {
            std::cout << "The code was error_brack\n";
        }
    }
	
//		regex e("abc[abc]{5,}");//{5,} 表示后面后面至少为5位
	}

return 1;
}


The second note

#include<regex>
#include<iostream>
using namespace std;

int main(){//提取匹配的值

	string t;

	while(1){		
		cin>>t;
		smatch m;  //typedef std::match_results<string>
		try {
			regex e("([[:w:]]+)@([[:w:]]+).com");//首先对要提取的字符串分组()
			bool match = regex_search(t, m, e); //是匹配子字符串,匹配的值会放到smatch中
			cout<<"msize="<<m.size()<<endl;
			for(int i=0 ; i < m.size();i++){
				cout<<"m["<<i<<"]="<<m[i].str()<<endl;
			}
			cout<<"m.prefix().str():"<<m.prefix().str()<<endl;//匹配字符前面的字符
			cout<<"m.suffix().str():"<<m.suffix().str()<<endl;//匹配字符后面的字符
		} 
		catch (const std::regex_error& e) {
			std::cout << "regex_error caught: " << e.what() << '\n';
			if (e.code() == std::regex_constants::error_brack) {
				std::cout << "The code was error_brack\n";
			}
		}
	}

	return 1;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值