zoukankan      html  css  js  c++  java
  • 理解c++11正则表达式 (1)

    概要

    C++11提出了正则表达式这个概念,只需在头文件中包含#include<regex>即可。我们可以完成:

    • Match 将整个输入拿来比对匹配某个正则表达式
    • Search 查找与正则表达式吻合的pattern
    • Tokenize 根据被指定的正则表达式的切分器取得语汇单元,即切词
    • Replace 简单的理解就是替换掉和正则表达式吻合的第一个子序列

     

    正文

    首先,我们看一下下面的代码:

    regex reg1("<.*>.*</.*>");
    bool found = regex_match("<tag>value</tag>",reg1);
    out(found);
    

    .  指得是除了 换行符 以外的所有字符。

    *指的是“0次或者多次”。

    通过regex_match()函数判断是否吻合上述的pattern(样式)。regex_match("<tag>value</tag>",reg1)将返回true。

    regex reg2("<(.*)>.*</\1>");
    bool found = regex_match("<tag>value</tag>",reg2);
    out(found);
    

    (.*)定义了所谓的capture group 捕获组的概念,通过这个(.*),之后就可以通过1来指代它了。我们可以采用另一种写法(raw string):

    regex reg2(R("<(.*)>.*</1>"));

    这个方法允许准确的写出其内容。他的准确格式是R"delim()delim" delim指的是字符序列,不包含空格,括号,反斜线。

    regex reg3("<\(.*\)>.*</\1>",regex_constants::grep);
    bool found = regex_match("<tag>value</tag>",reg3);
    out(found);
    

     第二个实参类似unix grep命令。必须用额外的反斜线将欲成为group的字符包起来。

    bool found = regex_match("<tag>value</tag>","<(.*)>.*</\1>");   //error
    bool found = regex_match(string("<tag>value</tag>"),"<(.*)>.*</\1>"); //error
    bool found = regex_match("<tag>value</tag>", regex("<(.*)>.*</\1>")); //right

    从上面的例子可以看出,在regex_match函数里调用string是不够的,虽然有隐式转换,但是语句会报错。

    最后是讨论regex_search()和regex_match()的唯一的区别:

    regex_match():检验是否整个字符串列 和某个正则表达式吻合。

    regex_search(): 检验部分是否吻合。

    我们可以查看下面的例子:

    regex_search(data,regex(pattern));
    regex_match(data,regex("(.*|
    )* + pattern + (.*|
    )*"));

     (.*| )* 指的是:任何数量 任何字符包括 。 值的是而上面的两个函数表达的意思是同一个。

    小结

    我们可以从上面的例子看出,两个函数只能进行true | false的查找?如果我想知道 我这个位置在哪儿?怎么办?那就需要介绍新版的regex_search()和regex_match()。

    注:C++11学习笔记 转载请注明出处。

     

  • 相关阅读:
    CentOS 7搭建SVN服务器
    CentOS 配置MySQL允许远程登录
    使用nginx实现基于tcp协议的https协议多域名指向的分别转发功能
    centos7 设置内核启动顺序
    nginx 针对特定地区的ip进行规则匹配
    【转】golang 交叉编译
    linux修改用户id,组id
    etcd 增减节点
    [转]etcd 启用 https
    windows 多网卡路由设置
  • 原文地址:https://www.cnblogs.com/yusenwu/p/5291612.html
Copyright © 2011-2022 走看看