**
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)允许在指定的内容中使用$1、$2、$3、……。
分组:在正则表达式中利用()扩住的部分就是一个分组。
$1表示字符串中匹配第一个分组的子串内容。
$2表示字符串中匹配第二个分组的子串内容。
var str=“abcdefg”,reg=/c(\w\w)\w/;
var result1=str.replace(reg,"1");
console.log(result1); //ab1g
var result2=str.replace(reg,"1$1");
console.log(result2); //ab1deg
var result3=str.replace(reg,"1$2");
console.log(result3); //ab1$2g
(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);