理解c++11正则表达式 (1)
2016-03-18 12:49
239 查看
概要
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("(.*|\n)* + pattern + (.*|\n)*"));
(.*|\n)* 指的是:任何数量 任何字符包括\n。 | 值的是 或。而上面的两个函数表达的意思是同一个。
小结
我们可以从上面的例子看出,两个函数只能进行true | false的查找?如果我想知道 我这个位置在哪儿?怎么办?那就需要介绍新版的regex_search()和regex_match()。注:C++11学习笔记 转载请注明出处。
相关文章推荐
- C++的顶层const和底层const的理解
- C++中的操作符属性
- 【C/C++】C语言union(联合体 共用体)
- c++中深拷贝和浅拷贝问题
- VS 使用过程问题集锦(更新中)
- 51Nod一级算法题-1182-完美字符串(贪心)
- 51Nod基础题-1384-全排列(搜索)
- NYOJ题目27-水池数目(搜索)
- NYOJ题目58-最少步数(搜索)
- c++ 在客户端的GCC使用
- 名字修饰约定extern "C"与extern "C++"浅析
- C++ map
- C++ 虚函数表
- C语言实现函数重载
- C Function
- c++打字游戏
- c++打字游戏
- c++打字游戏
- c++打字游戏
- c++打字游戏