C++ 11 以后有了正则表达式,对于处理字符串还是很方便的.由于我也再学习.所以下面的内容有可能描述的不准确,这些都是我自己代码中使用的,或者demo测试的.
首先使用正则表达式先要添加头文件
#include <regex>
然后编写自己的正则表达式:
例如我想匹配字符串中表示数字的格式,qwetr_11_34_12qwefasdf
我想输出11_34_12这几个字符,我们就可以编辑正则表达式.
std::regex regexStr("\\d{2}_\\d{2}_\\d{2}");
其中\\d表示数字,{}里面表示几个.这样就匹配出对应的字符串了.
std::sregex_iterator it1(str1Name.begin(), str1Name.end(), regexStr);
std::sregex_iterator end1;
std::string str1Data;
while (it1 != end1)
{
std::smatch match = *it1;
str1Data = match.str();
++it1;
}
这样str1Data就输出我们想要的字符串了.
在 regex中, 标准库为正则表达式提供了如下支持.
regex_match():将正则表达式与一个(已知长度的)字符串进行匹配.
regex_search(): 在一个(任意长度的)数据流中搜索与正则表达式匹配的字符串.
regex_replace(): 在一个(任意长的)数据流中搜索与正则表达式匹配的字符串并将其替换.
regex_iterator: 遍历匹配结果和子匹配.
regex_token_iterator: 遍历未匹配部分.
正则表达式的符号表示
. 任意单个字符 | \ 下一个字符有特殊含义 |
[ 字符集开始 | * 零或多次重复(后缀操作符) |
] 字符集结束 | + 一或多次重复(后缀操作符) |
{ 指定重复次数开始 | ? 可选零或一次(后缀操作符) |
} 指定重复次数结束 | | 二选一 (或) |
( 分组开始 | ^ 行开始: 非 |
) 分组结束 | $ 行结束 |
{n} 严格重复n次 |
{n,} 重复n次或者更多次 |
{n,m} 至少重复n次,最多重复m次 |
* 零次或多次,即 {0,} |
+ 一次或多次,即 {1,} |
? 可选零次或一次, 即 {0,1} |
alnum | 任意字母数字字符 |
alpha | 任意字母字符 |
blank | 任意空白符,但不能是行分隔符 |
cntrl | 任意控制字符 |
d | 十进制数字 |
digit | 任意十进制数字 |
graph | 任意图形字符 |
lower | 任意小写字符 |
punct | 任意标点 |
s | 任意空白符 |
space | 任意空白符 |
upper | 任意大写字符 |
w | 任意单词字符(字母,数字,下划线) |
xdigit | 任意十六进制数字字符 |
任意可打印字符 |
在正则表达式中,字符集名字必须用[: :]包围起来.例如[:digit:]匹配一个十进制数字.而且,如果是定义一个字符集,外面还必须再包围一对方括号[].
\d 一个十进制数字 | [[:digit:]] |
\s 一个空白符(空格或制表符等) | [[:space:]] |
\w 一个字母(a~z),数字(0~9),或者下划线(_) | [_[:alnum:]] |
\D 非十进制数字 | [^[:digit:]] |
\S 非空白符 | [^[:space:]] |
\W 非字母,数字与下划线 | [^_[:alnum:]] |
\l 一个小写字符 | [[:lower:]] |
\u 一个大写字符 | [[:upper:]] |
\L 非小写字符 | [^[:lower:]] |
\U 非大写字符 | [^[:upper:]] |