• C++ 正则表达式


    //1.当函数返回string时候的注意点:
    string Fun()
    {
    	return string("szn");
    }
    
    const char* pStr = Fun().c_str();
    //如上代码,pStr = "" 而非 "szn",原因:返回的string变量被析构了
    
    
    //2.正则表达式组件:
    regex:用于表示一个正则表达式
    regex_match:将一个字符序列与一个正则表达式匹配
    regex_search:寻找第一个与正则表达式匹配的子序列
    regex_replace:使用给定格式替换一个正则表达式
    sregex_iterator:迭代器适配器,调用regex_search来遍历一个string中所有匹配的字串
    smatch:容器类,保存在string中搜索的结果
    ssub_match:string中匹配的子表达式的结果
    
    regex文件中的一些定义:
    typedef basic_regex<char> regex;
    typedef basic_regex<wchar_t> wregex;
    typedef match_results<const char *> cmatch;
    typedef match_results<const wchar_t *> wcmatch;
    typedef match_results<string::const_iterator> smatch;
    typedef match_results<wstring::const_iterator> wsmatch;
    
    regex_search, regex_match的参数(返回值均为bool类型):
    seq, m, r, mft
    seq, r, mft
    seq:字符序列
    m:与seq兼容的match对象
    r:一个正则表达式
    mtf:可选值,用来保存匹配结果的相关细节
    
    输入类型与正则表达式库对应关系:
    string			regex, smatch, ssub_match, sregex_iterator
    const char*		regex, cmatch, csub_match, cregex_iterator
    wstring			wregex, wsmatch, wssub_match, wsregex_iterator
    const wchar_t*	wregex, wcmatch, wcsub_match, wcregex_iterator
    
    regex(和 wregex)选项:
    regex r(re, f):f为可选参数,默认为 regex::ECMAScript,此标志控制regex对象的处理过程
    	f:
    	regex::icase		忽略大小写
    	regex::nosubs		不保存匹配的子表达式
    	regex::optimize		执行速度优于构造速度
    	regex::ECMAScript	
    	regex::basic
    	regex::extended
    	regex::awk
    	regex::grep
    	regex::egrep
    =:赋值操作
    	regex re;
    	re = "[123]";
    r.assign(re, f):功能等同于赋值操作
    r.mark_count():r中表达式数目
    r.flags():返回r的标志集
    
    
    //3.regex_search使用示例:
    regex re("[[:alpha:]]*[^c]ei[[:alpha:]]*");
    cmatch cm;
    if (regex_search("receipt freind theif recive", cm, re))
    {
    	const char* pStrC = cm.str().c_str();	//pStrC = ""
    	string str = cm.str();					//str = "freind"
    }
    
    regex re("[a-z]+", regex::icase);
    smatch sm;
    string strContent("12 3456ABCabc7 89");
    if (regex_search(strContent, sm, re))
    {
    	string str = sm.str();					//str = "ABCabc"
    }
    ssub_match subMatch = sm[0];
    string str = subMatch;						//str = "ABCabc"
    
    
    //4.
    A:一个正则表达式的语法是否正确是在运行时候进行解析的
    B:若编写的正则表达式有误,则运行时,标准库会抛出一个regex_error的异常
    C:正则表达式的编译可能会是一个非常慢的操作,所以要避免创建很多没必要的regex变量
    try
    {
    	regex re("[");
    }
    catch (std::regex_error e)					//e = {_Err=error_brack }
    {
    	printf("");								//运行至此
    }
    
    enum error_type
    {	// identify error
    	error_collate,
    	error_ctype,
    	error_escape,
    	error_backref,
    	error_brack,
    	error_paren,
    	error_brace,
    	error_badbrace,
    	error_range,
    	error_space,
    	error_badrepeat,
    	error_complexity,
    	error_stack,
    	error_parse,
    	error_syntax
    };
    
    //5.sregex_iterator
    A:sregex_iterator it(b, e, r); 一个 sregex_iterator 遍历迭代器表示string,调用 regex_search 将 it 定位到输入中第一个匹配的位置
    B:sregex_iterator end; sregex_iterator 的尾后迭代器
    C:*it it-> 根据最后一个调用 regex_search 的结果,返回一个 smatch 对象的指针或引用
    D:++it it++ 从输入序列当前位置开始调用 regex_search
    
    使用示例
    string str = "abc 123 sdfd4567sdf 456 sdf";
    regex re(" ([0-9]+) ");
    smatch sm;
    vector<string> vecStr[2];
    
    for (sregex_iterator it(str.begin(), str.end(), re), ItEnd; it != ItEnd; ++it)
    {
    	vecStr[0].emplace_back(it->str()); 
    	vecStr[1].emplace_back(it->str(1));
    }
    //vecStr[0] = [2](" 123 "," 456 ")
    //vecStr[1] = [2]("123","456")
    
    
    //6.
    A:正则语法通常用括号表示子表达式
    
    
    //7.regex_replace使用的简单示例
    regex re("[0-9]+");
    string str("abc123efg456");
    string str0 = regex_replace(str, re, string("Test"));												//str0 = "abcTestefgTest"
    string str1 = regex_replace(str, re, string("Test"), std::regex_constants::format_first_only);		//str1 = "abcTestefg456"
    
    string str("123abc45_abc_67");
    regex re("([0-9]+)([a-z]+)([0-9]+)");
    std::smatch sm;
    if (regex_search(str, sm, re))
    {
    	string str0 = sm.str(0);		//str0 = "123abc45"
    	string str1 = sm.str(1);		//str1 = "123"	
    	string str2 = sm.str(2);		//str2 = "abc"
    	string str3 = sm.str(3);		//str3 = "45"
    }
    string strRe0 = std::regex_replace(str, re, string("szn"));		//strRe0 = "szn_abc_67"
    string strRe1 = std::regex_replace(str, re, string("$1szn$3"));	//strRe1 = "123szn45_abc_67"
    
    match_default = 0x0000,		//默认
    match_not_bol = 0x0001,		//不将首字符作为行首处理
    match_not_eol = 0x0002,		//不将尾字符作为行尾处理
    match_not_bow = 0x0004,		//不将首字符作为单词首处理
    match_not_eow = 0x0008,		//不将尾字符作为单词尾处理
    match_any = 0x0010,			//若存在多个匹配,则返回任意一个匹配
    match_not_null = 0x0020,	//不匹配任何空序列
    match_continuous = 0x0040,	//匹配必须从输入的首字符开始
    match_prev_avail = 0x0100,	//输入序列包含第一个匹配之前的内容
    format_default = 0x0000,	//用ECMAScript规则替换字符串
    format_sed = 0x0400,		//用POXIS sed规则替换字符串
    format_no_copy = 0x0800,	//不输出输入部分中未匹配的部分
    format_first_only = 0x1000,	//只替换子表达式第一次出现的位置
    
    
    //8.regex_match使用示例
    regex re0("[0-9]+");
    regex re1("[0-9a-z]+");
    string str("abc123");
    bool nRe0 = regex_match(str, re0);	//nRe0 = false
    bool nRe1 = regex_match(str, re1);	//nRe1 = true
    
    regex_match 必须匹配被分析串的全部,若不匹配返回 false ,否则返回 true
    

      

  • 相关阅读:
    CentOS 5.5 Oracle 11g
    安装VMware后,设置WinRM
    Scientific linux 6 使用第三方软件仓库(转)
    ASP.NET 标签问题
    《Linux网络编程》读书笔记
    基本通信模型
    SQL Server中的自增长
    windows平台通信基础
    线程学习小结
    SQL Server中添加注释
  • 原文地址:https://www.cnblogs.com/szn409/p/7471427.html
Copyright © 2020-2023  润新知