目尽地平线 2019-06-21
正则表达式是处理字符串的一门艺术手法,应用场景经常出现在表单验证部分;
JavaScript高级程序设计一书开篇提到,JavaScript这门语言最原始的应用就是处理输入验证操作,所以正则表达式从JavaScript诞生那一刻就与其结下不解之缘;
正则表达式(Regular Expression)可以理解为规则表达式,即以表达式的形式定义一项规则,然后根据这一规则去检索字符串,最后根据匹配结果进行后续的处理操作(判断、获取或是替换等);
正则表达式根据创建形式的不同,可分为字面量和构造函数RegExp对象;
1.1 字面量方法
正则表达式的字面量方法由正则模式(pattern)和修饰符(flags)构成;
var regExp = /pattern/flags;
1.2 RegExp构造函数
可以通过RegExp这一构造函数去创建一个正则表达式对象;
var regExp = new RegExp('pattern','flags')
需要注意的二者不同在于:字面量采用/pattern/
,而正则对象采用"pattern"
字符串;所以出现转义字符时,构造函数创建的正则对象的参数需要进行转义;
var regExp = /\hello\/; var regExp1 = new RegExp('\\hello\\');
1.3 flags规则
模式的规则将会在下文单独开一章讲解,先讲述flags
规则;
正则表达式可以添加3个修饰符从而起到改变检索规则的作用;
g:表示全局模式,检索所有字符串,而不是发现第一个匹配项时停止检索;
i:表示忽略大小写模式;
m:表示多行模式,进行多行的检索;
模式的规则是正则表达式的核心部分,模式可有普通字符(打印字符和非打印字符)和特殊字符构成;
2.1 普通字符
普通字符由所有数字、中外文字母、标点符号和非打印字符构成;
非打印字符包括:
\cx:control-x \n:换行符; \r:回车符; \t:制表符; \v:垂直制表符; \f:换页符; \s:空白字符,等价于[\f\n\r\t\v]
2.2 特殊字符
所谓特殊字符,就是具有特殊含义的字符,包括:限定符、定位符、类型符、分组符、条件符、非获取匹配符等
限定符
限定符限定一个正则表达式出现次数;
*:匹配前面子表达式任意次,等价于{0,}; +:匹配前面子表达式1次以上,等价于{1,}; ?:匹配前面子表达式0次或1次,等价于{0,1}; {n}:匹配子表达式n次; {n,}:匹配子表达式n次以上; {n,m}:匹配子表达式n~m次之间,默认是贪婪模式取m次,当在该限定符后面添加?开启非贪婪模式;这个?可应用于所有限定符后;
定位符
定位符能够高效匹配到字符出现位置;
^:匹配字符串开始的位置,注意在[]中表示取反匹配; $:匹配字符串结尾的位置; \b:匹配字符边界;
类型符
类型符是小羊自己为了记忆方便定义的,就是可以匹配不同的数据类型;
.:匹配除换行符的任意字符; \w:匹配任何单词字符,等价于[a-zA-z0-9]; \d:匹配数字;
分组符
():将表达式放入圆括号成为子表达式;
条件符
|:分支条件,匹配位于|两侧的字表达,相当于或;
非获取匹配符
非获取匹配符指的是匹配表达式但不获取匹配结果;
(?:pattern):匹配 pattern 但不获取匹配结果; (?=pattern):正向预查,在任何匹配 pattern 的字符串开始处匹配查找字符串; (?!pattern):负向预查,在任何不匹配 pattern 的字符串开始处匹配查找字符串
取反操作
下面这几个都是对应先前特殊字符的取反操作;
\D \W \B \S [^pattern]
反向引用
对一个正则表达式模式或部分模式两边添加圆括号将导致相关匹配存储到一个临时缓冲区中,所捕获的每个子匹配都按照在正则表达式模式中从左到右出现的顺序存储。缓冲区编号从 1 开始,最多可存储 99 个捕获的子表达式;
Is is the cost of of gasoline going up up? /\b([a-z]+) \1\b/gi 匹配Is is和up up
3.1 字符串的方法
match:接受正则表达式,返回匹配结果;
replace:接受两个参数,第一个为正则,第二个为替换值(也可以是一个函数),返回新字符串,不改变原字符串;
3.2 正则实例的属性和方法
正则实例的属性
正则实例的属性主要包括ignoreCase、global、multiline返回是否设置修饰符的布尔值,lastIndex返回下一次开始搜索的位置,source返回正则表达式的字符串形式;
正则实例的属性
test:传入一个字符串,返回布尔值表示匹配结果的判断;带有修饰符g时,每一次test方法都从上一次结束的位置开始向后匹配;
exec:传入一个字符串,返回匹配结果的数组;
下面根据目前常用的表单验证时用到的正则,给出几个检索的案例;解;
3.1 手机号码检索
function isPhoneNum(str){ //020-80723000 //07518869865 //13832132341 var regExp = /^0\d{2}[-]?\d{8}|^0\d{3}[-]?\d{7}|^1\d{10}/ return regExp.test(str); };
3.2 E-mail检索
function isEmail(str){ var regExp = /^[a-zA-Z]\w*@[0-9a-zA-Z]+\.[a-zA-Z]+/; return regExp.test(str) };
3.3 密码检索
function isValidPassword(str){ //长度6-20个字符,包括大写字母、小写字母、数字、下划线至少两种 if(/\W*/.test(str)){ return false }else if(/\w{0,5}|\w{21,}/.test(str)){ return false; }else if(/^\d+$|^[a-zA-Z]$|^_+$/.test(str)){ return false }else{ return true; } }
3.4 用户名的检索
function isValidUsername(str){ //长度为6-20个字符,只能包括字母数字和下划线 var regExp = /^\w{6,20}$/ return regExp.test(str); };
3. 5 Url检索
https://www.baidu.com:8080/index.html#q=hello https:// ([a-zA-Z]*:\/\/)? www.baidu.com \S+ :8080 (:\d*)? / \/ index.html \S* #q=hello (#.*)?
通过本文,我们可以了解到:
正则表达式可以理解为根据规定的规则,去检索字符串然后根据匹配结果进行后续的处理,处理可以包括判断、获取和替换;
正则表达式的创建方法可以使用字面量和构造函数形式;两种方法都是由正则模式和修饰符构成,不同之处在于构造函数需要以字符串形式传参;
修饰符规则部分可以传递三个参数,分别为g
、i
和m
,可以起到改变检索规则的作用;
模式规则作为正则表达式,由普通字符和特殊字符构成;
普通字符包括打印字符和非打印字符;
特殊字符即那些具有特殊含义的字符,主要包括限定符
、定位符
、类型符
、分组符
、分组符
、条件符
、非获取匹配符
等;
正则表达式以实例形式出现时,拥有自己的属性和方法,并且字符串的一些方法与正则表达式也存在密切的关系;
字符串的方法包括:match
和replace
方法;
正则实例的属性和方法包括:ignonreCase
、global
、multiline
、test
和exec
等;
最后给出了几个正则表达式的应用实例,包括手机号码、密码、用户名、E-mail和URL检索
;
《JavaScript高级程序设计(第3版)》