Javascript学习笔记——正则表达式

要点

元字符——描述某个位置上允许出现哪些字符,如\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}$/
匹配DDDDDDDDD,正则表达式为/^\d{2,4}$/
匹配DDDDDD,正则表达式为/^\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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值