正则表达式(regular expression) 是对于字符串匹配的一种方法。
正则表达式可以用来检查一个字符串是否含有某种子字符串,将匹配的子字符串替换,或者从某个串中取出符合某种条件的子字符串。
在c中一般用regex这个类来使用的。 很多接口都封装的这个类中
1、正则表达式的基本语法
1.1 特殊含义的字符
^ 指出一个字符串的开始 例如 "^hello" 表示以hello开始的字符串,“hello 妹子”, "hello 软妹子" 都是符合定出的规则
$ 指出一个字符串的结束 例如“嘿嘿黑$" 表示一嘿嘿嘿结尾的字符串, 例如”呵呵嘿嘿嘿“,”hello 嘿嘿嘿“
* 表示没有或者多个 “hello*” 表示一个字符串中含有一个子串是累似于 “hello”, “hellooo”, “helloooo.....”等等
+ 表示后面有至少一个以上
? 表示字符串hell后面跟着0个或者一个o
同时大括号可以决定后面跟几个
“ma{3}” 表示一个字符串有一个m跟着3个a “maaa”
“ma{3,}” 表示一个字符串有一个m后面至少跟了3个a 类似与 +
”ma{3,6}“表示一个字符串有一个m后面有3到6个a
| 或操作
”meizi | ruanmeizi“ 表示一个字符串有”meizi“ 或者 "ruanmeizi" 这两个字符串
”(b | cd) ef“ 表示某个字符串有”bef" 或者 ”cdef“ 这两个字符串
”(a "| b) * c)“ 表示c前面有 0 | n 个 a | c 例如"ac",”abc“, "aac", "ababc".....
. 可以替代任何字符
”a.[0-9]“ 表示一个字符串有一个”a" 后面跟着一个任意字符和一个数字;
"^.{3}$" 表示有任意三个字符的字符串(长度为3个字符)
[]方括号表示某些字符云逊在一个字符串中的某一特定位置出现:
"[ab]" 表示一个字符串有一个”a“ 或 ”b“ (相当于”a | b“)
"[a-d]" 表示一个字符串包含小写的”a” 到 “d“中的一个(相当于 "a|b|c|d" 或者 ”[abcd]")
"^[a-zA-Z]"表示一个以字母开头的字符串
“[0-9]%” 表示一个百分号前有一位的数字
“,[a-zA-Z0-9]$”表示一个字符串以一个都好后面跟着一个字母或数字结束
你也可以在方括号里用‘^’表示不希望出现的字符,‘^’应在方括号里的第一位
“%[^a-zA-Z]%” 表示两个百分号中不应该出现字母
1.2 字符集
”^(\d){1}$“表示一个字符为10进制的数字
"^(\l){1}$"表示一个字符为小写的字符
"^(\s){1}$"表示一个字符的空白符
"^(\u){1}$"表示一个字符的大写字母
"^(\w){1}$"一个字母 a~z A~Z 或者数字 0~9 或者下划线
"^(\D){1}$"除了 \d的之外字符
”^(\L){1}$“除了\l的之外字符
"^(\S){1}$"除了\s的之外字符
"^(\U){1}$”除了\u的之外字符
"^(\W){1}$"除了'w之外的字符
2、正则表达式的应用事例通俗说明
2.1 校验是否全由数字组成
“^[0-9]{1,20}$”
^ 表示大头的字符要匹配紧跟^后面的规则
$ 表示大头的字符要匹配紧靠$前面的规则
[] 中的内容是可选字符集
[0-9] 表示要求字符范围在0-9 之间
{1,20} 表示数字字符串长度合法为1到20, 即为[0~9]中的字符出现次数的范围是1到20次
^ 和 $ 成对使用表示要求整个字符串完全匹配定义的规则,而不是只匹配字符串中的一个子串
2.2 校验登录名:只能输入5~20个以字母开头、可带数字、“_"、”." 的子串
”^[a-zA-Z]{1}([a-zA-Z0-9]|[._]){4,19}$“
^[a-zA-Z]{1} 表示第一个字符要求是字母
([a-zA-Z0-9]|[._]){4,19}表示从第二位开始(因为他金庚在上个表达式后面)的一个长度为4到19为的字符串,他要求是有大小写字母、数字或者特殊字符集[._]组成
2.3 校验用户名: 只能输入1~30个以字母开头的子串
"^[a-zA-Z]{1,30}$"
2.4 校验密码:只能输入6-20个字母、数字、下划线
"^(\w){6,20}$"
3、 关于c++的正则表达式的用法
下面这个事例是最简单的用法。 大家就举一反三吧
#include <iostream>
#include <regex>
using namespace std;
int main()
{
// 代表是0到9的数字 长度在3到10个字符之间
regex pattern("^[0-9]{3,10}$");
// regex_match() 是比较的 如果符合就返回true 如果不符合则返回false
if ( regex_match("24312k",pattern)== false)
{
printf("this string is not conform\n");
}
if ( regex_match("12345543", pattern) == false)
{
printf("this string is not conform\n");
}
printf("this string is conform\n");
getchar();
return 0;
}
从示例程序可以看出 先声明一个regex类型的对象,并通过构造函数来定义规则, 之后只要调用regex_match来进行匹配, 如果匹配成功则返回true,如果匹配不成功则返回false。
4、 Regular Expression 的内部实现
关于Regular Expression的实现, 用到了不少的自动机理论(Automata Theory)的只是, 有兴趣的可以找这方面的资料来看,这本书"Introduction to Automata Theory, Languages, and Computation" 写的很好, 编译远离的书也有这方面的内容