😉一、正则表达式的概念
正则表达式(Regular Expression,常简写为regex、regexp或RE)。正则表达式通常被用来检索、替换那些符合某个模式(规则)的文本。C++11开始支持正则表达式。
正则表达式非常强大,具体的实现算法有差异,所以会有多种实现方式。C++11支持6种正则表达式引擎。ECMAScript 是其中支持最多元素的引擎,也是regex默认支持的引擎。
- ECMAScript
- basic(POSIX Basic Regular Expressions)
- extended(POSIX Extended Regular Expressions )
- awk(POSIX awk)
- grep(POSIX grep )
- egrep(POSIX grep –E)
正则表达式主要两部分构成,特殊字符和普通字符。
字符 | 描述 |
\ | 转义字符 |
$ | 匹配字符行尾 |
* | 匹配前面的子表达式任意多次 |
+ | 匹配前面的子表达式一次或多次 |
? | 匹配前面的子表达式零次或一次 |
{m} | 匹配确定的m次 |
{m,} | 匹配至少m次 |
{m,n} | {m,n} |
. | 匹配任意字符 |
x | y |
[xyz] | 字符集合,匹配包含的任意一个字符 |
[^xyz] | 匹配未包含的任意字符 |
[a-z] | 字符范围,匹配指定范围内的任意字符 |
[^a-z] | 匹配任何不在指定范围内的任意字符 |
字符 | 描述 |
\w | 匹配字母或数字或下划线,任意一个字母或数字或下划线,即AZ,az,0~9,_中任意一个 |
\W | 匹配任意不是字母、数字、下划线的字符 |
\s | 匹配任意的空白符,包括空格、制表符、换页符等空白字符的其中任意一个,与”[ \f\n\r\t\v]”等效 |
\S | 匹配任意不是空白符的字符,与”[^\f\n\r\t\v]”等效 |
\d | 匹配数字,任意一个数字,0~9中的任意一个,等效于”[0-9]” |
\D | 匹配任意非数字的字符,等效于”[^0-9]” |
\b | 匹配一个字边界,即字与空格间的位置,也就是单词和空格之间的位置,不匹配任何字符,如,“er\b"匹配"never"中的"er”,但不匹配"verb"中的"er" |
\B | 非字边界匹配,“er\B"匹配"verb"中的"er”,但不匹配"never"中的"er" |
\f | 匹配一个换页符,等价于”\x0c”和”\cL” |
\n | 匹配一个换行符,等价于”\x0a”和”\cJ” |
\r | 匹配一个回车符,等价于”\x0d”和”\cM” |
\t | 匹配一个制表符,等价于”\x09”和”\cI” |
\v | 匹配一个垂直制表符,等价于”\x0b”和”\cK” |
\cx | 匹配”x”指示的控制字符,如,\cM匹配Control-M或回车符,”x”的值必须在”A-Z”或”a-z”之间,如果不是这样,则假定c就是"c"字符本身 |
regex_match
全文匹配,即要求整个字符串符合匹配规则,返回true或false
#include "iostream" #include "regex" using namespace std; int main() { std::string str="1111-1"; cout<<std::regex_match(str,regex("\\d{4}-\\d{1,2}"))<<endl;//匹配”四个数字-一个或两个数字“,返回值为1匹配成功 str="1320550505@qq.com"; cout<<regex_match(str,regex("\\d{1,}@qq.com"))<<endl;//匹配”QQ邮箱“,返回值为1匹配成功 return 0; }
regex_search
搜索匹配,即搜索字符串中存在符合规则的子字符串。
#include "iostream" #include "regex" using namespace std; int main() { string str= "hello2019-02-03word"; smatch match; regex regex1("(\\d{4})-(\\d{1,2})-(\\d{1,2})");//搜索规则()表示把内容拿出来,不加()的话只有match[0],没有[1][2][3] std::cout<<regex_search(str,match,regex1);//找到了返回1 std::cout<<match[0];//2019-02-03 std::cout<<match[1];//2019 std::cout<<match[2];//02 std::cout<<match[3];//03 return 0; }
#include "iostream" #include "regex" using namespace std; int main() { string str = "hello2019-02-03word,hello2019-02-03word,hello2019-02-03word "; smatch match; regex regex1("(\\d{4})-(\\d{1,2})-(\\d{1,2})");//搜索规则()表示把内容拿出来,不加()的话只有match[0],没有[1][2][3] string::const_iterator citer = str.cbegin(); while (regex_search(citer, str.cend(), match, regex1)) { citer = match[0].second;//将迭代器的指针指向匹配到的字符串后面的位置 for (size_t i = 1; i < match.size(); i++) { cout << match[i] << " ";//把三个括号里面的内容拿出来 } cout << endl; } return 0; }
regex_replace
替换匹配,即可以将符合匹配规则的子字符串替换为其他字符串。
#include "iostream" #include "regex" using namespace std; int main() { string str = "hello2019-02-03word,hello2019-02-03word,hello2019-02-03word"; regex regex1("-"); cout << regex_replace(str, regex1, "/") << endl;//hello2019/02/03word,hello2019/02/03word,hello2019/02/03word,函数的返回值就是代替之后的结果 return 0; }
🧊文章总结
提示:这里对文章进行总结:
本文讲了关于正则表达式的书写,自己写一遍就会发现很简单,学到就是赚到