前言
在c++中,有三种正则可以选择使用,C ++regex,POSIX regex,boost regex 如果在windows下开发c++,默认不支持后面两种正则,如果想快速应用,显然C++ regex 比较方便使用。文章将讨论C++
regex 正则表达式的使用。
- c++ regex 通常匹配模式用 “()”
- POSIX regex 通常匹配模式用 “[]”
- boost regex 支持perl regular表达式、POSIX-Extended regular表达式和POSIX-Basic Regular表达式,但默认的表达式语法是perl语法,如果要使用其余两种语法需要在构造表达式的时候明确指定。
常用函数
regex_match
全词匹配
regex_search
搜索其中匹配的字符串
regex_search和regex_match区别
regex_match是全词匹配,而regex_search是搜索其中匹配的字符串。
regex_replace
替换正则表达式匹配内容的函数
正则表达式的规则
特殊字符
特殊字符(用于匹配很难形容的字符)
注:在C++反斜杠字符(\)会被转义
std::regex e1 (“\d”); // \d -> 匹配数字字符
std::regex e2 (“\\”); // \ -> 匹配反斜杠字符
数量
练习
1、匹配电话号码
题目:
J.Doe:248-555-1234
答案:
正则表达式:
[2-9]?\\d\\d-[2-9]{3}-[1-9]{4}
void test1() { std::string src = "J.Doe:248-555-1234"; std::string pattern = "[2-9]?\\d\\d-[2-9]{3}-[1-9]{4}"; std::regex model(pattern); std::smatch m; std::cout << "Src: " << src << std::endl; std::cout << "Expression: " << pattern << std::endl; std::cout << "Result:" << std::endl; while (std::regex_search(src, m, model)) { for (auto x = m.begin(); x != m.end(); x++) { std::cout << x->str() << "\n"; } std::cout << " pattern:" << pattern << " suffix:" << m.format("$2") << std::endl; src = m.suffix().str(); } }
2、匹配整数或者小数(包括正数和负数)
题目:
ad-10s-()#@a?.@../}[#{!d2.5678 4z^&*|?ss1a3.14ssd2q3.qq
匹配小数:
正则表达式:
\\d+\\.[0-9]+
匹配整数:
正则表达式:
\\d+
匹配负数:
正则表达式:
-\\d+(\\.\\d+)?
匹配整数或者小数(包括正数和负数):
-?[0-9]+(\\.[0-9]+)?
void test2() { std::string src = "ad-10s-()#@a?.@../}[#{!d2.5678 4z^&*|?ss1a3.14ssd2q3.qq-3.111-3...."; //小数 //std::string pattern = "\\d+\\.[0-9]+"; //整数 //std::string pattern = "\\d+"; //负数 //std::string pattern = "-\\d+(\\.\\d+)?"; // std::string pattern = "-?[0-9]+(\\.[0-9]+)?"; std::smatch m; std::regex model(pattern); std::cout << "Src: " << src << std::endl; std::cout << "Expression: " << pattern << std::endl; std::cout << "Result:" << std::endl; while (std::regex_search(src, m, model)) { for (auto x = m.begin(); x != m.end(); x++) { std::cout << x->str() << "\n"; } std::cout << " pattern:" << pattern << " suffix:" << m.format("$2") << std::endl; src = m.suffix().str(); } }
练习3、匹配出最内层小括号以及小括号内的表达式
1-2*((60-30+(-40/5)*(9-2*5/3+7/3*99/4*2998+10*568/14))-(-4*3)/(16-3*2))((1+11)+2)
1)从上面算式中匹配出最内层小括号以及小括号内的表达式
答案:
正则表达式:
\\([^()]+\\)
\\(坐标左括号起始 ,[^()]+ 表示 1-n个非‘(’和‘)’,\\)转义右括号结尾。 这里我在纠结[]里面的字符需要不需要转义\\ 貌似不影响。
练习4 匹配类似html标签内容
<a>wahaha</a> <b>banana</b> <h1>qqxing</h1>
这样的字符串中,
1)匹配出wahaha,banana,qqxing内容
答案:
正则表达式:
[^<>]+\\w+[^<>/]
2)匹配出a,b,h1这样的内容
答案:
正则表达式:
\\<\\w+\\>
\w 表示字母数字或者下划线
另一种类POSIX
总结
1、符号基本需要加\转义
2.[]{}()作用?
[]指定字符集合
{}数量范围
()子表达式