正则表达式(regular expression)_好大一只鸡的博客-CSDN博客
正则表达式(Regular Expression)基本概念及理解_X1nZz的博客-CSDN博客_正则表达式的定义
ECMAScript正则表达式_HuiDT的博客-CSDN博客_ecmascript正则表达式
详解C++正则表达式 - 红叶空间 - 博客园
C/C++ 正则表达式 regex库介绍(详细版)_余识-的博客-CSDN博客_regex库
正则表达式又称为: 规则表达式。
作用:一般用于 检索 或 者 替换某些符合所选设置规则(或模式)的文本
使用:正则表达式是普通字符或者一些特殊字符组成的字符模式,将此作为一个字符模板进行与所需要的文本进行字符串的模糊匹配,以达到所需要的效果。
正则表达式常用字符:
头文件: #include
三种用法:
regex_match :全文匹配,即要求整个字符串符合匹配规则,返回true或false(不改变字符串本身)
regex_search:搜索匹配,即搜索字符串中存在符合规则的子字符串。
regex_replace: 替换匹配,即可以将符合匹配规则的子字符串替换为其他字符串。(会改变字符串本身)
- include <regex>
- #include <iostream>
- #include <string>
- using namespace std;
-
-
- int main1()
- {
- string n;
- int res = 0;
- while (!res)
- {
- cout << "请输入手机号" << endl;
- cin >> n;
-
- res = regex_match(n, regex("132\\d{8}"));
- cout << res << endl;
- if (res == 0)
- {
- cout << "输入格式不正确" << endl;
- }
- }
-
- return 0;
- }
- //\d表示一个数字:但是在具体的使用中,必须要写成\\d,因为\\表示一个杠
- //3个数字用\d{3}表示,具体匹配中,写作\\d{3}
- //单个\表示转移字符
-
- #include <string>
- #include <iostream>
- #include <regex>
- using namespace std;
- int main()
- {
- // \\d{3}表示3个数字
- string pattern("\\d{3}\\d{8}");
- regex r(pattern);
- smatch results;
- string str;
- cin >> str;
- if(regex_match(str,results,r))
- {
- cout << "success match:";
- cout << results.str() << endl;
- }
- return 0;
- }
有问题的一段代码:下面的代码,匹配 三个数字,0个或者1个-、.、空格,但是如果输入
123 12312312就不能完成匹配。为何?
- #include <string>
- #include <iostream>
- #include <regex>
- using namespace std;
- int main()
- {
-
- try{
- string pattern("\\d{3}([-. ])?\\d{8}");
- regex r(pattern,regex::icase);
- smatch results;
- string file;
- cin >> file;
- if(regex_match(file,results,r))
- {
- cout << "yes,matched:";
- cout << results.str() << endl;
- }
- }
- catch (regex_error e)
- {
- cout << e.what() << endl;
- cout << e.code() << endl;
- }
-
- return 0;
- }
- #include <string>
- #include <iostream>
- #include <regex>
- #include <vector>
- using namespace std;
- int main()
- {
- string pattern("(\\d{3})([ .-])?(\\d{4})");
- regex r(pattern);
- smatch results;
- vector<string> v{"123 1234","123.1234","123-1234","1231234"};
-
- for(auto &i : v)
- {
- if(regex_match(i,results,r))
- {
- cout << "matched:" << results.str() << endl;
-
- }
-
- }
- return 0;
- }
运行结果:
- matched:123 1234
- matched:123.1234
- matched:123-1234
- matched:1231234
正则表达式的另一个例子:
- #include <string>
- #include <iostream>
- #include <regex>
- #include <vector>
-
- using namespace std;
-
- int main()
- {
- string pattern = "\\(?\\d{3}\\)?[ -.]?\\d{4}";
- regex r(pattern);
- smatch results;
- vector<string> str = {"(123 1234","123.1234","123-1234","1231234","123123123","123 1234)","(123).1234","123).1234","(123)1234"};
- for(auto &word : str)
- { if(regex_match(word,results,r))
- {
- cout << results.str() << endl;
- }
- }
- return 0;
- }
- (123 1234
- 123.1234
- 123-1234
- 1231234
- (123).1234
- 123).1234
- (123)1234
im.cc 是c++primer 655页里面的一个例子:
- #include <string>
- #include <iostream>
- #include <regex>
- #include <vector>
- using namespace std;
- int main()
- {
- string pattern = "(\\()?(\\d{3})(\\))?([ .-])?(\\d{4})([ .-]?)(\\d{4})";
- regex r(pattern,regex::icase);
- smatch results;
- string line;
- while(getline(cin,line))
- {
- for(sregex_iterator it(line.begin(),line.end(),r),end; it != end; ++ it)
- {
- cout << "matched:" << endl;
- cout << it -> str() << endl;
-
- }
-
- }
-
- return 0;
- }
- ~
运行结果:
- r@r:~/coml/c++/c++_primer/17/17.3/17.3.3/issue_code$ ./123
- 12312341234 (123)1234-1234 (123.12341234 (123)-1234-1234
- matched:
- 12312341234
- matched:
- (123)1234-1234
- matched:
- (123.12341234
- matched:
- (123)-1234-1234