正则表达式
本文最后更新于 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大写字母
print字母(不区分大小写)、数字、英文标点和空格
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_matchregex_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

https://blog.csdn.net/bgzclxqq/article/details/90262904

https://blog.csdn.net/u011475134/article/details/76167980

上一篇
下一篇