本文最后更新于 1484 天前,其中的信息可能已经有所发展或是发生改变。
元字符
\:转义; ^:^字符指示字符串的头,且要求字符串以字符开头; $:$字符指示字符串的尾,且要求字符串以字符结尾; 、():分组,大正则中包含小正则。可以改变默认的优先级。在模式中可以使用\1来表示第一组已然捕获到的东西; \b:指示字符串的边界(头/尾/空格左/空格右),字符\b 要求边界的左边是字符,\b字符 要求边界的右边是字符; .:表示一个除了\n以外的任意一个字符; |:字符串1|字符串2表示一个字符串,该字符串是字符串1、字符串2中的一个。|在正则中的优先级比较混乱,所以建议加上足够多的括号来分组; []:[字符1字符2字符3…]表示一个字符,该字符是字符1、字符2、字符3……中的某一个。中括号中出现的所有字符都是代表本身意思的字符(没有特殊含义),如[.]只能匹配.符号,而不能匹配任意符号。 [^字符1字符2字符3…]表示一个字符,该字符不是字符1、字符2、字符3……中的任何一个 [a-z]表示一个字符,该字符是a、b、c……z中的某一个 [^a-z]表示一个字符,该字符不是a、b、c……z中的任何一个*
:字符*
要求字符
出现0到多次;+
:字符+
要求字符
出现1到多次;?
:字符?
要求字符
出现0次或1次;{n}
:字符{n}
要求字符
出现n次;{n,}
:字符{n,}
要求字符
出现n到多次;{n,m}
:字符{n,m}
要求字符
出现n到m次;[:name:]
形式的字符类。例如:[[:alpha:]]
匹配一个字母(不区分大小写);
字符类名 | 说明 |
---|---|
alnum | 字母(不区分大小写)和数字 |
alpha | 字母(不区分大小写) |
blank | 空格或制表符 |
cntrl | 文件格式转义字符 |
digit | 数字 |
graph | 字母(不区分大小写)、数字和英文标点 |
lower | 小写字母 |
upper | 大写字母 |
字母(不区分大小写)、数字、英文标点和空格 | |
punct | 英文标点 |
sapce | 空格 |
xdigit | 表示十六进制的字符(数字,a,b,c,d,e,f,A,B,C,D,E,F) |
d | 与digit相同 |
s | 与space相同 |
w | 与alnum相同 |
转义序列 | 等效命名类 | 默认命名类 |
---|---|---|
\d | [[:d:]] | [[:digit:]] |
\D | [^[:D:]] | [^[:digit:]] |
\s | [[:s:]] | [[:space:]] |
\S | [^[:S:]] | [^[:space:]] |
\w | [[:w:]] | [a-zA-Z0-9] |
\W | [^[:W:]] | [^a-zA-Z0-9] |
断言 | 含义 |
---|---|
\b | 一个单词的边界 |
\B | 一个非单词的边界 |
(?=E) | 表达式后面紧跟着E才匹配成功,但不会改变目标序列中匹配的位置 |
(?!E) | 表达式后没有紧跟着E才匹配成功,但不会改变目标序列中匹配的位置 |
(?:E) | 表达式后面紧跟着E才匹配成功 |
ECMAScript
C++默认支持的正则表达式; 头文件:regex;regex_match
和regex_search
均可以进行匹配,返回一个布尔类型,匹配成功为true,匹配失败为false。前者要求完全匹配,后者要求子串匹配即可; 举例:regex r("\\d{1, 11}") 用来表示匹配11位数字的正则,两个\\为了抵消C++自身的转义; 举例三种用法: string str = "hhh233"; regex r("[a-z0-9]+"); bool flag = regex_match(str,r); bool flag = regex_match(str,regex("\\d+")); bool flag = regex_match(str.begin()+7,str.end(),regex("\\d+"));
邮箱格式
include<regex>
include<iostream>
using namespace std;
int main()
{
string str;
cin >> str;
regex e("([[:w:]]+)@([[:w:]]+)\.com");
smatch m;
bool found = regex_search(str, m, e);
if (found)
{
cout << "m.size(): " << m.size() << endl;
for (int i = 0; i < m.size(); ++i) {
cout << "m.str(" << i << "): " << m.str(i) << endl;
}
cout << "m.prefix().str(): " << m.prefix().str() << endl;
cout << "m.suffix().str(): " << m.suffix().str() << endl;
}
return 0;
}
即 字母数字@字母数字.com
输入:
<emailStart>yvanwzw@gmail.com<emailEnd>
输出:
m.size(): 3
m.str(0): yvanwzw@gmail.com
m.str(1): yvanwzw
m.str(2): gmail
m.prefix().str():<emailStart>
m.suffix().str():<emailEnd>
其中smatch
的实例存储匹配的结果,m.str(0)表示匹配全体,其余参数分别表示各匹配部分,共有m.size()分组(含全体匹配);prefix()为匹配全体之前项,suffix()为匹配全体之后项;
IP地址(十进制)
当整数是一位的时候,取值是0~9,正则表达式\\d
(反斜杠需要转义); 当整数是两位的时候,取值是0~9,正则表达式\\d{1,2}
; 当整数是三位的时候,当最高位是1的时候,其它两位的取值是0~9,正则表达式1\\d{1,2}
;当最高位是2的时候,其它两位的取值是0~5,正则表达式2[0-5]{1,2}
;
#include <regex>
#include <iostream>
using namespace std;
int main()
{
string re = "(\\d|\\d{1,2}|(1\\d{1,2})|2[0-5]{1,2})[.](\\d|\\d{1,2}|(1\\d{1,2})|2[0-5]{1,2})[.](\\d|\\d{1,2}|(1\\d{1,2})|2[0-5]{1,2})[.](\\d|\\d{1,2}|(1\\d{1,2})|2[0-5]{1,2})";
regex rule(re);
string str = "100.100.100.0";
cout << regex_match(str, rule) << endl;
return 0;
}
regex_replace
顾名思义,用于取代匹配项,如: string re1 = "i"; regex rule1(re1); string str = "i eat a apple."; str = regex_replace(str, rule1, "我");
sregex_iterator迭代器
用于需要遍历匹配/取代多项时使用;
include<iostream>
include<regex>
using namespace std;
int main()
{
string str = "asdf2332";
regex reg("([a-z]+)2");
for (sregex_iterator it(str.begin(), str.end(), reg), end; it != end; it++)
{
cout << "匹配成功" << endl;
}
return 0;
}
regex_token_iterator
include<iostream>
include<regex>
using namespace std;
int main()
{
string str = "11sigalhu233sigal244hu255";
regex reg("([a-z]+)2");
cout << "正则表达式:([a-z]+)2" << endl;
cout << "字符串为:" << str << endl;
for (sregex_token_iterator it(str.begin(), str.end(), reg), end; it != end; it++)
{
cout << "匹配到的字符串为:" << it->str() << endl;
}
cout << endl;
for (sregex_token_iterator it(str.begin(), str.end(), reg, 1), end; it != end; it++)
{
cout << "匹配到的字符串为:" << it->str() << endl;
}
cout << endl;
for (sregex_token_iterator it(str.begin(), str.end(), reg, -1), end; it != end; it++)
{
cout << "匹配到的字符串为:" << it->str() << endl;
}
cout << endl; return 0;
}
输出: 正则表达式:([a-z]+)2 字符串为:11sigalhu233sigal244hu255 匹配到的字符串为:sigalhu2 匹配到的字符串为:sigal2 匹配到的字符串为:hu2 匹配到的字符串为:sigalhu 匹配到的字符串为:sigal 匹配到的字符串为:hu 匹配到的字符串为:11 匹配到的字符串为:33 匹配到的字符串为:44 匹配到的字符串为:55
参数-1:获取各匹配的子序列之间的序列; 参数0:默认参数,即获取匹配的子序列; 参数n:获取第n个正则表达式所匹配的序列,如该代码中第一个为([a-z]+),第二个为2;
参考资料:
http://www.cplusplus.com/reference/regex/regex_token_iterator
https://blog.csdn.net/monk1992/article/details/86501678