1简介:
正则表达式(regular expression)描述了一种字符串匹配的模式,可以用来检查一个字符串中是否含有某种子串、将匹配的子串做替换或者从某个字符串中取出符合某个条件的子串等。
比如:在字符串“hello world”中,查找是否含有l,并且l后面不能是d。
正则表达式本身是一门独立的技术,可以被大多数编程语言所使用,如Javascript、PHP、Java
2应用场景
2.1 表单验证里面,验证字符的合法性,如邮箱是否合法,手机号是否合法等等。
2.2 信息过滤,如论坛帖子或者评论中的非法字符,例如 sql注入、js脚本注入、煽动性的言论。
2.3 信息采集,采集别人网站上面的内容,例如整页采集时 筛选出需求的部分
2.4 信息替换。
2.5 页面伪静态的规则
<script>
//从字符串php中,检查是否还有p字母
var str = 'php';
var result = str.match(/h/);
console.log(result);
//如果str中含有m,name返回一个包括m的数组
//如果str中没有m,返回null;
</script>
什么叫做匹配?
匹配的意思是在字符串中查找某个字符,如果查到了就表示匹配,如果没有查到表示不匹配。
正则表达式语法:
/正则规则/
正则表达式用两条斜线表示起始和结尾的标识符。
全局修饰符g
正则表达式用两条斜线表示起始和结尾的标识符。
没有修饰符g的时候,在匹配一次之后,将停止向后继续检索。
加入修饰符g之后,会一直检索到字符串的末尾,会将所有的匹配结果都查找出来。
正则语法
1、量词
n+ 匹配任何包含至少一个 n 的字符串。匹配一个或多个前导字符(前导字符就是紧挨着+的前一个字符)
n* 匹配任何包含零个或多个 n 的字符串。前导字符有没有都行
n? 匹配任何包含零个或一个 n 的字符串。
n{X} 匹配包含 X 个 n 的序列的字符串。
n{X,Y} 匹配包含 X 或 Y 个 n 的序列的字符串。
n{X,} 匹配包含至少 X 个 n 的序列的字符串。
n 表示只匹配字符串n。也就是匹配整个字符串。
2、元字符
. 查找单个字符,表示任意字符。除了换行和行结束符。
.* 表示任意字符串(0个或多个任意字符,除了换行和行结束符)
w 匹配任何数字、字母、下划线。一个w表示一个字符。
W 匹配任何非数字、字母、下划线。
d 查找数字。
D 查找非数字字符。
s 查找空白字符。
S 查找非空白字符。
匹配单词边界。(边界字母个数没有限制;放前面表示匹配单词前面的边界,表示匹配单词后面的边界)
理解的话 :重点是单词边界 ,一个字符串中,好几个单词,好几个边界。
B 匹配非单词边界。
查找换行符。
查找回车符。
查找制表符。
3、方括号
方括号表示一个范围,也称为字符簇。
[abc] 查找方括号之间的任何字符。
[^abc] 查找任何不在方括号之间的字符。(方括号中的^表示取反)
[0-9] 查找任何从 0 至 9 的数字。
[a-z] 查找任何从小写 a 到小写 z 的字符。
[A-Z] 查找任何从大写 A 到大写 Z 的字符。
[A-z] 查找任何从大写 A 到小写 z 的字符。包括下划线。
[5-8] 查找5 <= 目标 <= 8的字符
[adgk] 查找给定集合内的任何字符。
[^adgk] 查找给定集合外的任何字符。
(red|blue|green) 查找任何指定的选项。(竖线|表示或者)
4、修饰符
i 执行对大小写不敏感的匹配。
g 执行全局匹配(查找所有匹配而非在找到第一个匹配后停止)。
m 执行多行匹配。
5、特殊字符
有表示正则语法的符号,如果要查找这些符号的话,必须加斜线转义。
但是不是乱加斜线,比如查找字符串b,直接用b就可以了,如果加斜线,就表示匹配单词的边界。
分组/捕获和反向引用
捕获和反向引用的语法的解释:
正则中出现的小括号,就叫捕获或者分组
在正则语法中(在/…/内),在捕获的后面,用“1”来引用前面的捕获。
在正则语法外(如replace时),用“$1”来引用前面的捕获。
var str = '2552 7887 4567 8899'; var result = str.match(/(d)(d)21/g); console.log(result);
禁止引用
匹配中文
每个字符(中文、英文字母、数字、各种符号、拉丁文、韩文、日文等)都对应着一个Unicode编码。
查看Unicode编码,找到中文的部分,然后获取中文的Unicode编码的区间,就可以用正则匹配了。
中文的Unicode编码从4E00开始,到9FA5结束。
完整的Unicode编码表:http://blog.csdn.net/hherima/article/details/9045861
环视(断言/零宽断言)
(?=n) 匹配任何其后紧接指定字符串 n 的字符串。
!n 匹配任何其后没有紧接指定字符串 n 的字符串。
另外,还会看到(?!B)[A-Z]这种写法,其实它是[A-Z]范围里,排除B的意思,前置的(?!B)只是对后面数据的一个限定,从而达到过滤匹配的效果。
正则对象的属性和方法
regexp.exec && regexp.test
1 .exec方法和lastIndex属性
exec方法执行一个正则匹配,只匹配一次,匹配到的结果就返回一个数组类型的结果。匹配不到就返回null。并将表示匹配的位置 置为下一个匹配的位置。
lastIndex一个整数,标示开始下一次匹配的字符位置。没有更多匹配重置lastIndex为0.
匹配带子表达式的例子:
例二:
2. test方法
test方法检测目标字符串和正则表达式是否匹配,如果匹配返回true,不匹配返回false。
支持正则表达式的 String 对象的方法
1、search()
在字符串中搜索符合正则表达式的结果。如果找到结果返回结果的位置,停止向后检索,也就是说忽略全局标识符g;如果没有匹配结果,返回-1。
2、match() 在字符串中检索匹配正则表达式的子串;如果匹配,返回包含匹配结果的一个数组;不匹配返回null。
不加全局g的情况:
获取的结果只是第一个匹配的内容,匹配的内容中的第一个单元是匹配的结果,后面的单元是子表达式
3、split()
将字符串分割成数组
4 、replace ()
默认只替换一次,加g全部替换。
替换abc为a[a-b-c]c
替换aaa bbb ccc为Aaa Bbb Ccc
案例
1 匹配手机号格式是否正确
特定:
11位
纯数字
1开头
更加细致的特定:2/3位特定。
2、匹配邮箱格式是否正确
如果是特定的邮箱,@后面的部分固定。
比如使用新浪邮箱: sina.com sina.cn
比如qq邮箱: qq.com
这种验证邮箱格式的代码就比较简单了。
新浪邮箱要求:
4~16位
不能有大写字母
必须是字母开头
只能使用数字、字母、下划线
验证完整的邮箱格式:
@前面必须有用户名(理论上说要大于2位,小于255位,可以使用数字、字母、下划线、中横线、点)
必须有@
@后面有一个域名(理论上2~255位,可以是数字和字母)
必须有点
必须有后缀(可以是com/cn/org/gov/cc/net/edu)
后面两个部分可以有1到2个,如aaaa@sina.com.cn
3用户名验证
注册的时候,要求用户名:长度4~10位,不能是纯数字,不能是纯字母,不能有特殊符号,不能以数字打头。