zoukankan      html  css  js  c++  java
  • c++ 正则表达式

    正则表达式使用规则:

           *在c++z中使用转义符号都要双写不管是w,还是普通的符号,例如\w,\.

      1.单个内容的匹配符号:

        . :是针对除了换行符以外的任意一个字符.

        w:字母(大小写),数字,下划线(W是除了w之外的符号)

        d:数字(D是非数字)

        s:空白符(空格,制表,换行)(大写同上)

        :声明一个边界

        [ ]:匹配指定字符(例如:[a-zA-Z1-9]是匹配小写字母大写字母,""以及数字的一个字符)(匹配汉字的方法使用万国码[u4e00-u9fa5])

      2.匹配的字符个数:(用在单个限定样式的字符后面)

        +:匹配一个或多个字符

        *:匹配零个或是多个字符

        ?:匹配零个或是一个字符

        { }:匹配指定次数(例如{1,3}字符重复一次或是3次,也可以{3}只重复3次)

      3.分组匹配

        我们只需要把我们所需要的分组加上括号,之后我们可以通过smatch变量寻找(  该变量的列表中第一个元素永远是执行匹配操作的原始字符串,smatch mat,mat[1].str分组第一组  ).括号还有就是(jpg|bmp)的作用

    正则表达式函数调用:

    regex_match()对字符串进行匹配(一般不使用,因为字符串匹配的正则表达式要考虑到整个字符串)

    使用regex_search()对字符串进行循环寻找:

    正则表达式在对大量字符串的提取有效信息,所支持的头文件#include <regex>

          regex_match:将一个字符序列与一个正则表达式匹配
          regex_search:寻找第一个与正则表达式匹配的子序列
          regex_replace:使用给定格式替换一个正则表达式
          sregex_iterator:迭代器适配器,调用regex_search来遍历一个string中所有匹配的字串
     这里要注意的是这种在输入时要变成\b,这里的+代表一直找d知道遇到 '.'(如果我们只想找n个数字只需要把+换{n}即可),{1}代表着上面的组只循环一次
    循环搜索:
    	string test = "145341.35186410.200034uhvsv nfji7676876///1324531.1";
    	smatch mat;
    	regex rgx("(\d+\.){1}");
    	string::const_iterator start = test.begin();
    	string::const_iterator end = test.end();
    	
    	while (regex_search(start, end, mat, rgx))
    	{
    		cout << mat[1].str() << endl;
    		start = mat[0].second;
    	}
    

     输出结果:循环输出 

    下面是正则一些函数的使用方法:

    int main(){
    
        //第一种存储方式
        //match_results<string::const_iterator> result;
        //第二种存储方式
        smatch result;
    
        //文本数据
        string str="1994 is my birth year 1994";
        //正则表达式
        string regex_str("\d{4}");
        regex pattern1(regex_str,regex::icase);
    
        //迭代器声明
        string::const_iterator iter = str.begin();
        string::const_iterator iterEnd= str.end();
        string temp;
        //正则查找
        while (std::regex_search(iter,iterEnd,result,pattern1))
        {
            temp=result[0];
            cout<<temp<<endl;
            iter = result[0].second; //更新搜索起始位置
        }
    
        //正则匹配
        string regex_str2("(\d{4}).*");
        regex pattern2(regex_str2,regex::icase);
    
        if(regex_match(str,result,pattern2)){
            cout<<result[0]<<endl;
            cout<<result[1]<<endl;
        }
        
        //正则替换
        std::regex reg1("\d{4}");
        string t("1993");
        str = regex_replace(str,reg1,t); //trim_left
        cout<<str<<endl;
            
        return 0;
    }
    
  • 相关阅读:
    HDU 5188 zhx and contest(带限制条件的 01背包)
    Appium IOS 自己主动化測试初探
    微软自拍应用iOS版公布
    小白学开发(iOS)OC_ block数据类型(2015-08-08)
    从王自如和老罗的论战中我貌似懂得了点神马...
    trie树(字典树)
    分析深圳电信的新型HTTP劫持方式
    主要的约瑟夫环问题
    Linux下的led驱动程序,ok6410
    Android Support 包里到底有什么
  • 原文地址:https://www.cnblogs.com/yskn/p/9552530.html
Copyright © 2011-2022 走看看