不会用C++的Regex是硬伤,下面的内容参考《C++程序设计原理与实践》~~~![[转载]C++:Regex正则表达式 [转载]C++:Regex正则表达式](http://image109.360doc.com/DownloadImg/2017/08/1419/108411358_1.gif) ![[转载]C++:Regex正则表达式 [转载]C++:Regex正则表达式](http://image109.360doc.com/DownloadImg/2017/08/1419/108411358_1.gif)
****************************************************************************************************
正则表达式语法
正则表达式的特性分成很多种类,下面的内容是perl类型的Regex。
============================================================================================
特殊含义的字符
. :任意单个字符
[] :字符集
{} :计数
() :子模式
:下一个字符具有特殊含义
* :0个或多个
+ :一个或多个
? :0个或一个
| :或
^ :行的开始;否定
$ :行的结束
===========================================================================================
字符集
d :一个十进制数字
l :一个小写字母
s :一个空白符(空格符,制表符等)
u :一个大写字母
w :一个字母(a~z或A~Z)或数字(0~9)或下划线(_)
D :除了d之外的字符
L :除了l之外的字符
S :除了s之外的字符
U :除了u之外的字符
W :除了w之外的字符
===========================================================================================
重复
{n} :严格重复n次
{n,} :重复n次或更多次
{n,m}:重复至少n次,至多m次
* :{0,}
+ :{1,}
?
:{0,1}
===========================================================================================
子模式
为了指定模式中的子模式,用括号将其括起来
(d*:)?(d+):它表示字符串前半部分可以为空,若非空,则是任意长度的数字后接一个冒号,后半部分是一个或多个数字的序列。
===========================================================================================
可选项
|
表示二选一的概念。
Subject:(FW:| Re:):表示匹配Subject:Fw:或者是Subject:Re:
===========================================================================================
正则表达式错误
当我们将一个模式富裕regex时,它会对模式进行检查,如果发现模式不合法或过于复杂,无法用于匹配时,它会抛出一个bad_expression异常。
===========================================================================================
下面是一个常用的套路,比较稳~~~
![[转载]C++:Regex正则表达式 [转载]C++:Regex正则表达式](http://image109.360doc.com/DownloadImg/2017/08/1419/108411358_2)
注意一点,编译的时候要指定链接:g++ -Wall -lboost_regex test.cpp -o chen
*****************************************************************************************************
正则表达式方法
=====================================================================================================
(1)regex_match:确定一行字符串是否和指定的正则表达式完全匹配
-----------------------------------------------------------------------
//检查模式是否匹配
8 #include
<boost/regex.hpp>
9 #include
<iostream>
10 #include
<string>
11
12 using namespace std;
13 using namespace boost;
14
15 int main()
16 {
17
// "w+s*((w+,d+)s*)*"
18
regex pattern("\w+\s*(\(\w+,\d+\)\s*)*");
19
cout << pattern
<< endl;
20
21
string str_1 = "chen (chen,0) (huan,1) (jiang,2)";
22
string str_2 = "chen(chen,0)(huan,1)(jiang,2)";
23
string str_3 = "chen";
24
string str_4 = "(chen,0)(huan,1)(jiang,2)";
25
string str_5 = "chen (chen,0) (huan,1)(jiang,2) chen";
26
27
vector<string> strings;
28
strings.push_back(str_1); strings.push_back(str_2);
29
strings.push_back(str_3); strings.push_back(str_4);
30
strings.push_back(str_5);
31
32
for(int n = 0 ; n < 5 ; ++n)
33
if(regex_match(strings[n], pattern))
34
cout << strings[n]
<< " is matched"
<< endl;
35
36
return 0;
37 }
结果为:
w+s*((w+,d+)s*)*
chen (chen,0) (huan,1) (jiang,2) is matched
chen(chen,0)(huan,1)(jiang,2) is matched
chen is matched
--------------------------------------------------------------------------
//regex_match不仅验证是否匹配,而且可以从中提取出正则表达式括号对应的子串
8 #include
<boost/regex.hpp>
9 #include
<iostream>
10 #include
<string>
11
12 using namespace std;
13 using namespace boost;
14
15 int main()
16 {
17
// "w+s*((w+,d+)s*)*"
18
regex pattern("\w+\s*((\(\w+,\d+\)\s*)*)");
19
cout << pattern
<< endl;
20
21
string str_1 = "chen (chen,0) (huan,1) (jiang,2)";
22
23
smatch mat;
24
if(regex_match(str_1, mat, pattern))
25
for(smatch::iterator iter=mat.begin() ; iter!=mat.end() ;
++iter)
26
cout << *iter
<<endl;
27 |