JavaScript 正则表达式详解

113 阅读3分钟

JavaScript 正则表达式详解

正则表达式属于字符串范畴,由两部分组成:原义字符、元字符。 1、原义字符:书写在正则表达式中表示为字面意思的字符。 2、元字符:书写在正则表达式中表示为特定含义的字符。 基本元字符、范围元字符、重复元字符、转义字符、贪婪匹配符、后向引用。

一、基本元字符:

1、. 匹配任意字符。 2、* 匹配前一个字符出现的次数为0次或多次。 3、? 匹配前一个字符出现的次数为0次或1次。 4、+ 匹配前一个字符出现的次数为1次或多次。 5、^ 匹配以后面的字符开头。 6、$ 匹配以前面的字符结尾。 7、| 匹配|两端出现的字符中的任意一个,表示“或”的意思。

二、如何创建正则表达式:

1、利用字面量创建正则表达式: var reg=/abc/; 2、利用构造函数创建正则表达式: var reg=new RegExp(“abc”); 3、创建正则表达式时可以为正则表达式添加修饰符: (1)g,表示全局匹配。 (2)i,表示忽略大小写。 例如:利用字面量创建正则表达式。 var reg=/a./gi; var str='abcdaefgawdA9fa3eweaa'; 例如:利用构造函数创建正则表达式。 var reg=new RegExp("a.","gi"); var str='abcdaefgawdA9fa3eweaa'; 4、创建带有转义字符的正则表达式:

三、与正则表达式有关的字符串方法:

1、match(reg):

功能:返回字符串匹配正则表达式reg的子串内容。 该功能返回的是一个长得像数组的对象(只匹配第一个子串)或数组(全局匹配)。 例如:match()返回下列格式。 ["ab", index: 0, input: "abcdaefgawdA9fa3eweaa", groups: undefined] 索引值为0的元素是匹配正则表达式的唯一结果。 index:返回匹配正则表达式的子串的索引值。 input:返回源字符串。 groups:返回正则表达式的分组结果。 结论:凡是利用match()返回的匹配结果都要带下标。 若字符串没有匹配reg的子串,则返回null。 2、search(reg): 功能:返回字符串匹配正则表达式reg的子串位置。 该功能返回的是一个索引值。 若字符串没有匹配reg的子串,则返回-1。

3、replace():

功能:将字符串中匹配正则表达式的子串替换为指定的内容。 格式:字符串.replace(reg,content) 字符串.replace(reg,function(){}) (1)var str=“abcdefg”,reg=/c\w/; var result=str.replace(reg,“123”); console.log(result); //ab123efg (2)允许在指定的内容中使用11、2、3。分组:在正则表达式中利用()扩住的部分就是一个分组。3、……。 分组:在正则表达式中利用()扩住的部分就是一个分组。 1表示字符串中匹配第一个分组的子串内容。 2表示字符串中匹配第二个分组的子串内容。varstr=abcdefg,reg=/c(\w\w)\w/;varresult1=str.replace(reg,"1");console.log(result1);//ab1gvarresult2=str.replace(reg,"12表示字符串中匹配第二个分组的子串内容。 var str=“abcdefg”,reg=/c(\w\w)\w/; var result1=str.replace(reg,"1"); console.log(result1); //ab1g var result2=str.replace(reg,"11"); console.log(result2); //ab1deg var result3=str.replace(reg,"12");console.log(result3);//ab12"); console.log(result3); //ab12g (3)字符串.replace(reg,function(result,sub){ //result - 字符串中匹配reg的最终结果 //sub - 每一个全局匹配中分组的部分 //回调函数什么时候执行:每一个分组执行一次,若没有分组则只执行一次。 //return 将什么内容用来替换字符串中匹配reg的子串 }) 例:将一个CSS属性名改为驼峰式命名。 list-style-type 驼峰式命名:listStyleType margin-bottom 驼峰式命名:marginBottom btn.onclick=function(){ var cssName=document.getElementsByName("cssName")[0].value; var reg=/-([a-z])/g; var result=cssName.replace(reg,function(result,sub){ return sub.toUpperCase(); }) alert(result); } 例1:匹配全部都是由原义字符组成的正则表达式。 var reg=/abc/; var str='今天我学习了abc'; var a=str.match(reg); var b=str.search(reg); console.log(a,b); 例2:第一个元字符(.)。 var reg=/a./; var str='abcdefg'; var a=str.match(reg); var b=str.search(reg); console.log(a,b); 例3:第二个元字符( ? +) var str='banana'; var reg1=/an+/; //以a开头,字符n出现了1次或多次的子串 var reg2=/(an)+/; //字符an出现了1次或多次的子串 var a=str.match(reg1); //an var b=str.match(reg2); //anan console.log(a,b); 例如:var s=“bannnnann” var c=str.match(/an*/); //以a开头,字符n出现了0次或多次的子串:annnn var d=str.match(/an?/); //以a开头,字符n出现了0次或1次的子串:an

例4:第七个元字符(|) var str=“I like football.”; var reg=/football|basketball/; var a=str.match(reg); //[“football”,index:7,input:“I like football”,groups:undefined]

四、范围元字符:

1、[abc] 表示匹配字符a或字符b或字符c。 2、[^abc] 表示匹配除了字符a和字符b和字符c的字符。 3、[a-z] 表示匹配所有的小写字母。 4、[A-Z] 表示匹配所有的大写字母。 5、[0-9] 表示匹配所有的数字。 6、[b-d] 表示匹配小写字母b到d。 注意:这种正则表达式在书写时必须按照从小到大的顺序书写,例如[z-a]是非法的。

五、重复元字符:

1、{m} 限制前一个字符可以重复出现m次。 2、{m,} 限制前一个字符可以重复出现至少m次。 3、{m,n} 限制前一个字符可以重复出现m到n次。 例5:书写一个用来匹配邮政编码的正则表达式。 石家庄的邮政编码 050000。邮政编码的特点:6位数字。 正则表达式:/[0-9]{6}/ 例6:书写一个用来匹配带有区号的固定电话的正则表达式。 例如:0311-85047726。 固定电话的特点:区号三位或四位,区号必须以0开头,电话号码七位或八位。 正则表达式:/0[0-9]{2,3}-[0-9]{7,8}/ 例7:制作一个表单,表单中有一个要求输入固定电话的文本框,如何利用正则表达式进 行表单的验证。 var btnNode=document.querySelector(".btn"); btnNode.addEventListener("click",function(){ event.preventDefault(); var phone=document.getElementsByName("phone")[0]; var reg=/^0[0-9]{2,3}-[0-9]{7,8}$/; // if(phone.value.match(reg)= = = null ){ // if(phone.value.search(reg) = = =-1){ if(!reg.test(phone.value)){ alert("您输入的固定电话不符合规格"); }else{ document.forms[0].submit(); } }) 总结:关于判断字符串中是否具备匹配正则表达式的子串,可以有三种方法。 字符串.match(正则表达式)= = =null //成立,不匹配;不成立,匹配 字符串.search(正则表达式)= = =-1 //成立,不匹配;不成立,匹配 正则表达式.test(字符串)===false //成立,不匹配;不成立,匹配

六、正则表达式是单字符匹配:

1、1个元字符只能匹配1个字符,或对1个字符进行限制。 2、例8:设一所培训学校的专业讲师的讲师编号为八位字符,是按照下列规律进行编排的:讲师必须以大写字母T开头,接下来的两位表示讲师的入职年份,取值范围规定为10-30,例如某讲师是2017年入职,则这两位应该取值为17。接下来的两位为主讲课程的编号,规定该培训学校共有15门课程需要讲解,即这两位取值范围为01-15。接下来的两位为讲师顺序号,取值范围为01-99,按照讲师入职的先后顺序排列。最后一位是讲师的学历编号,专科学历为“Z”,本科学历为“B”,研究生学历为“Y”,其他学历不予考虑。

/^T([12][0-9]|30)(0[1-9]|1[0-5])(0[1-9]|[1-9][0-9])(Z|B|Y)$/

3、例9: (1)身份证号: 前六位:130105 6位数字 出生年份:4位 1900-2099 ((19|20)[0-9]{2}) 出生月份:2位 01-12 (0[1-9]|1[0-2]) 出生日期:2位 01-31 (0[1-9]|1[0-9]|2[0-9]|3[0-1]) (0 [1-9]|[1-2][0-9]|3[0-1]) (0[1-9]|[12][0-9]|3[01]) 最后四位:4位数字或3位数字X(大小写均可) ([0-9]{4}|[0-9]{3}[Xx])

 /^[0-9]{6}((19|20)[0-9]{2})(0[1-9]|1[0-2])(0[1-9]|[12][0-9]|3[01])([0-9]{4}|[0-9]{3}[Xx])$/
/^\d{6}((19|20)\d{2})(0[1-9]|1[0-2])(0[1-9]|[12]\d|3[01])(\d{4}|\d{3}[Xx])$/

(2)电子邮箱地址:用户名@电子邮箱服务器名 @qq.com @163.com @之前的用户名只能包含特定的字符:字母大小写、数字、_、、*、# 用户名不得少于5个字符。 /^[A-Za-z0-9_*#]{5,}@[a-z0-9]{2,}.[a-z]{2,}$/ (3)手机号码:

七、转义字符:

1、什么是转义字符:转义字符都是以\开头的,后面跟一个或几个字符,整体的含义已经不 是这个字符所表示的本意,而是转换为指定的含义,所以叫做“转义字符”。 2、第一组:元字符作为原义字符使用时需要转义。 . \ \’ \” ^ $ < > * ? + 3、第二组:控制字符转义。 \n \t \f \r \v 4、第三组:转义元字符。 \d,表示任意一个数字,等同于[0-9]。 \D,表示任意一个非数字,等同于[^0-9]。 \w,表示任意一个数字或字母或空格。 \W,表示任意一个非数字、字母、空格。 \s,表示任意一个空白符(空格、换行、Tab键)。 \S,表示任意一个非空白符。 \b,表示单词边界(空格、换行、句子开头、标点符号)。 \B,表示非单词边界。 (1)删除字符串两端的空格: 原理:利用正则表达式匹配字符串两端的空格并使用空串进行替换。 var str=“ ab cd ”,reg=/^\s+|\s+$/g; str.replace(reg,“”); //ab cd (2)将句子中的每个单词的首字母大写: 原理:利用正则表达式匹配每一个单词,将每一个单词的首字母设置为大写。 var str=“he is a teacher,and a boy.”,reg=/\b(\w)/g; var result=str.replace(reg,function(result,sub){ return sub.toUpperCase(); }) console.log(result);