要点
元字符——描述某个位置上允许出现哪些字符,如\d
字符类——自定义版元字符,如[01]
子模式——多个元字符/普通字符组成的一串字符,如(cat\d)
限定符——描述字符或子模式的出现次数,如\d*
、(cat)+
字符类[\d\+\.]
整体匹配一个字符;[]
整体只占据一个字符的位置
而子模式(\.\d{2,4})
是括号()
括起来的一串字符,由多个元字符/普通字符组成
元字符、字符类和子模式,都可以搭配限定符*
、+
,实现任意次数的匹配
引入
问题:验证一个字符串是否符合邮箱地址格式
判断文本是否符合某些特征,可以使用正则表达式
正则表达式不是精确的字符匹配,而是从侧面描述文本所具有的特征
例如:“字符串开头有1个"$",中间有若干数字,末尾可能有小数点和若干数字”
这段话从侧面描述了$3
、$1.15
、$9.98
等字符串的特征
正则表达式RegExp
正则表达式(Regular Expression)类似字符串字面量(string literal),但不是出现在一堆引号里
格式:/ +Expression+/
元字符——用于描述正则表达式的基本元素
表达式由元字符(metacharacter)组成,从而描述文本模式,即允许文本中出现哪些字符
常用元字符:
.
匹配任何字符(换行符newline除外)
\d
匹配数字字符
\w
匹配数字或字母字符
\s
匹配“空白”(包括space、tab、换行符、return/enter)
^
字符串需要以模式开始(其后面紧随的模式必须是字符串中第一个字符)
$
字符串需要以模式结束(其前面的模式必须是字符串中最后一个字符)
例如
/\d\d\/
可能匹配到“cat22”、“a25b”、“10 mile”
/^\d\d\$/
可能匹配到“22”、“25”、“10”
{}
限定符(不是元字符),搭配元字符,指定子模式可以出现的次数范围
|
选替(alternation),搭配元字符,指定子模式可以出现的次数范围
例如
匹配DDDD
,正则表达式为/^\d\d\d\d$/
,等效于/^\d{4}$/
匹配DDDD
、DDD
或DD
,正则表达式为/^\d{2,4}$/
匹配DDDD
或DD
,正则表达式为/^\d{2}|\d{4}$/
()
括号中的部分作为一个整体
例如
对于/^(red|blue) pill$/
,“red pill”或“blue pill”都符合这个模式的匹配结果
如果想匹配元字符(例如$)怎么办?
正则表达式中具有特殊意义的字符,可以通过反斜线\
转义
特殊意义的字符有:^、&、*、+、.、|、?、()、[、\
等
例如
匹配XX+YY
,正则表达式为/^\d{2}\+\d{2}$/
匹配XX-YY
,正则表达式为/^\d{2}-\d{2}$/
要匹配其他没有特殊意义的字符,可以直接放入正则表达式,这些字符将被一一对应地精确匹配
例如
表达式/cat/
,将匹配出任何包含“cat”的字符串
元字符——描述某个位置上允许出现哪些字符
限定符——描述这些字符能够出现多少次
限定符——灵活的模式长度描述
限定符(quantifier)可以实现更精确的正则表达式描述
限定符作用于子模式(sub-pattern),可以控制子模式在模式中的出现次数
一般格式:子模式 +限定符
子模式:一些普通字符、元字符的集合,使用括号()
括住,成为子模式
常用限定符:
*
允许子模式不出现/出现任意次数
?
允许子模式不出现/仅出现1次
+
子模式必须出现(可出现任意次数)
{n}
子模式必须出现n次
{n,m}
子模式必须出现n~m次
结合元字符和限定符构造正则表达式,几乎能匹配任何字符串
例如
/.+/
任意字符需出现一次及以上(用于匹配非空字符串)
/(Hot )?Donuts/
可以匹配出“Donuts”或“Hot Donuts”
字符类——自定义的单字符匹配
[]
是字符类(Character class),是匹配单个字符的规则
在方括号[]
内填入一组字符,其中每个字符都是合格的字符匹配目标
这样,字符类就规定了在某处位置上允许出现哪些字符
可见,字符类的功能类似于/d/
等元字符,可以看作自定义版的元字符
例如
对于/d[io]g/
,“dig”和“dog”都匹配模式
对于/[0-3]/
,“0”、“1”、“2”、“3”都匹配模式
匹配时,方括号[]
整体只占据一个字符的位置,常搭配限定符*
、+
,实现任意次数的匹配
应用场景:已知可能出现的字符,但它们无序排列
例如
/[01]+/
可以匹配二进制码串“1111”、“1010000”、“111111110”等等
/\w+[\.\w]+/
可以匹配“xxx.net”、“www.xxx.com.cn”等
综合运用——验证文本是否为邮箱地址
一些可能的邮箱地址:
cube_lover@youcube.ca
i-love-donuts@donuts.com
rocky2021@i-rock.mobi
a+b@youcube.com.cn
特点总结:
@前面部分为字母、数字、-、_、+的组合
@后面部分为字母、数字、-的组合
域名后缀(suffix)部分为.cn
、.com
、.mobi
等,且可能出现多次
写出对应的正则表达式
/^[\w-_\+]+@[\w-]+(\.\w{2,4})+$/
再次注意:
[\w-_\+]
整体匹配一个字符;
而(\.\w{2,4})
是括号()
括起来的一串字符,称为子模式(由多个元字符/普通字符组成)
创建并使用正则表达式
创建正则表达式
使用构造函数RegExp
可创建正则表达式
var reg = new RegExp(/^\d{3}-?\d{4}$/);
查找字符串中的匹配子串:使用字符串的match()
方法
match()
方法:传入正则表达式RegExp
- 返回数组,数组包含与正则表达式匹配的所有子串;
- 如果 regexp 没有标志 g,执行一次匹配。数组的第 0 个元素存放的是匹配文本,而其余的元素存放的是与正则表达式的子表达式匹配的文本;此外数组还有属性
index
声明匹配文本的起始字符下标 - 如果 regexp 具有标志 g,执行全局检索。全局匹配返回的数组的内容与前者大不相同,它的数组元素中存放的是所有的匹配子串
var reg = new RegExp(/^\d{3}-?\d{4}$/);
var str="5551212";
var result=str.match(reg);
//result的值为数组["5551212"]
- 若返回null,说明未找到匹配的子串
null
是一个假值,因此可以这样判断字符串是否匹配特定的模式
function validate(phoneNumber){//匹配模式ddd-dddd或ddddddd
return phoneNumber.match(/^\d{3}-?\d{4}$/)==true;
}
检查字符串中是否包含指定的模式:RegExp
对象的test()
方法
Javascript中,正则表达式属于RegExp
对象,该对象包含test()
方法,可以用于检查字符串中是否存在指定的模式
var regex = /^d{5}$/;
if(regex.test(inputField.value)==True)
//The code is valid
编写专门化的函数
编写专门化的函数validateRegEx
,用于实现通用性的验证工作
function validateRegEx(regex, inputstr, helpText, helpMessage)
//see if the inputstr data validates OK
if(!regex.test(inputstr)){//invalid
if (helpText != null)
helpText.innerHTML= helpMessage;//呈现辅助信息
return false;
}
else{//valid
if (helpText != null)
helpText.innerHTML= "";//数据无误,清楚辅助信息
return true;
}
}
参考来源:《Head First JavaScript》p320