1.什么是正则表达式
正则表达式(Regular Expression,简称regexp)
是一种描述字符串结构的语法规则。
是一个特定的格式化模式,用于验证各种字符串是否匹配这个特征,进而实现高级的文本查找、替换、截取内容等操作。
应用:在项目开发中,手机号码指定位数的隐藏、数据采集、敏感词的过滤以及表单的验证等功能,都可以利用正则表达式来实现。
适用领域:在操作系统(Unix、Linux等)、编程语言(C、C++、Java、PHP、Python、JavaScript等)。
举例:以文本查找为例,若在大量的文本中找出符合某个特征的字符串(如手机号码),就将这个特征按照正则表达式的语法写出来,形成一个计算机程序识别的模式(Pattern),然后计算机程序就会根据这个模式到文本中进行匹配,找出符合规则的字符串。
2.如何使用正则
在开发中,经常需要根据正则匹配模式完成对指定字符串的搜索和匹配。
RegExp对象提供的exec()方法
String对象提供的match()方法
exec()方法
exec()方法用于在目标字符串中搜索匹配,一次仅返回一个匹配结果。
例如,在指定字符串str中搜索abc。
var str = 'AbC123abc456';
varreg = /abc/i;// 定义正则对象
reg.exec(str); // 匹配结果: ["AbC", index: 0, input:"AbC123abc456"]
“/abc/i”中的“/”是正则表达式的定界符,“abc”表示正则表达式的模式文本,“I”是模式修饰标识符,表示在str中忽略大小写。
exec()方法的参数是待匹配的字符串str,匹配成功时,该方法的返回值是一个数组,否则返回null。
从exec()的返回结果中可以看出,该数组保存的第1个元素(AbC)表示匹配到的字符串;第2个元素index表示匹配到的字符位于目标字符串中的索引值(从0开始计算);第3个参数input表示目标字符串(AbC123abc456)。
match()方法
String对象中的match()方法除了可在字符串内检索指定的值外,还可以在目标字符串中根据正则匹配出所有符合要求的内容,匹配成功后将其保存到数组中,匹配失败则返回false。
var str = "It's is the shorthand ofit is";
var reg1 = /it/gi;
str.match(reg1); // 匹配结果:(2) ["It","it"]
var reg2 = /^it/gi;
str.match(reg2); // 匹配结果:["It"]
var reg3 = /s/gi;
str.match(reg3); // 匹配结果:(4) ["s", "s","s", "s"]
var reg4 = /s$/gi;
str.match(reg4); // 匹配结果:["s"]
定位符“^”,可用于匹配字符串开始的位置。
定位符“$”,可用于匹配字符串结尾的位置。
g表示全局匹配,用于在找到第一个匹配之后仍然继续查找。
3.获取正则对象
在JavaScript应用中,使用正则表达式之前首先需要创建正则对象。除了前面讲解过的字面量方式创建外,还可以通过RegExp对象的构造函数的方式创建。
//① 字面量方式
/pattern/flags
//② RegExp对象构造函数方式
newRegExp(pattern [, flags])
RegExp(pattern [, flags])
pattern是由元字符和文本字符组成的正则表达式模式文本。
元字符是具有特殊含义的字符,如“^”、“.”或“*”等。
文本字符就是普通的文本,如字母和数字等。
flags表示模式修饰标识符,用于进一步对正则表达式进行设置。

模式修饰符,还可以根据实际需求多个组合在一起使用。
例如,既要忽视大小写又要进行全局匹配,则可以直接使用gi,并且在编写多个模式修饰符时没有顺序要求。
因此,模式修饰符的合理使用,可使正则表达式变得更加简洁、直观。
为了让读者更好的理解正则对象的获取,以匹配特殊字符“^”、“$”、“*”、“.”和“\”为例进行对比讲解。
varstr = '^abc\\1.23*edf$';
var reg1 = /\.|\$|\*|\^|\\/gi; // 字面量方式创建正则对象
var reg2 = RegExp('\\.|\\$|\\*|\\^|\\\\', 'gi'); // 构造函数方式创建正则对象
str.match(reg1); // 匹配结果:(5) ["^", "\",".", "*", "$"]
str.match(reg2); // 匹配结果:(5) ["^", "\",".", "*", "$"]
选择符“|”表示“或”,查找条件只要其中一个条件满足即可成立。
JavaScript中字符串存在转义问题,因此代码中str里的“\\”表示反斜线“\”。
在正则中匹配特殊字符时,也需要反斜线(\)对特殊字符进行转义。例如,“\\\\”经过字符串转义后变成“\\”,然后正则表达式再用“\\”去匹配“\”。
注意:构造函数方式与字面量方式创建的正则对象,虽然在功能上完全一致,但它们在语法实现上有一定的区别,前者的pattern在使用时需要对反斜杠(\)进行转义。而后者的pattern在编写时,要放在定界符“/”内,flags标记则放在结尾定界符之外。
参考代码
<script type="text/javascript">
var str = "ABC123abc";
var reg1 = /abc/; //定义正则对象
var res1 = reg1.exec(str);//匹配结果
console.log(res1);//abc,index:6
var reg2 = /abc/i;//"i":模式修饰符,忽略大小写;"abc"是表示正则表达式的模式文本;"/"正则表达式的定界符
var res2 = reg2.exec(str);
console.log(res2);//ABC,index:0
var reg3 = /abcd/i;
var res3 = reg3.exec(str);
console.log(res3);//null
/*
方法说明:
exec()方法用于在目标字符串中搜索匹配,一次仅返回一个匹配结果
*/
</script>
<script>
var str = "It's is the shorthand of it is";
var reg1 = /it/gi;//"g"模式修饰符:用于在目标字符串中进行全局匹配
var res1 = str.match(reg1);
console.log(res1);//(2)["It","it"]
var reg2 = /abc/gi;
var res2 = str.match(reg2);
console.log(res2);//null
//定位符"^",用于确定字符在字符串中的位置,"^"用于匹配字符串开始的位置
//"$",用于匹配字符串结束的位置
var reg3 = /^it/gi;
var res3 = str.match(reg3);
console.log(res3);//["It"]
var reg4 = /is$/gi;
var res4 = str.match(reg4);
console.log(res4);//["is"]
var reg5 = /^it$/gi;
var res5 = str.match(reg5);
console.log(res5);//null
var reg6 = /^i.*s$/gi;
var res6 = str.match(reg6);
console.log(res6);//["It's is the shorthand of it is"]
</script>
<!--
RegExp对象构造函数方式
new RegExp(pattern [,flags])
pattern:模式文本,由元字符和文本字符组成的正则表达式模式文本
flags:模式修饰符
说明:
元字符:具有特殊含义的字符,如“^”、“.”或“*”、“$”、“?”
文本字符:如字母和数字
-->
<script type="text/javascript">
var str = "^abc\\1.23*edf$";
var reg1 = /\.|\^|\*|\$|\\/gi;//字面量方式创建正则对象
var res1 = str.match(reg1);
console.log(res1);
var reg2 = RegExp('\\.|\\^|\\*|\\$|\\\\','gi');//构造函数方式创建正则对象
var res2 = str.match(reg2);
console.log(res2);
/*
选择符“|”,可以理解为“或”,经常用于查找的条件有多个,只要有其中一个条件满足即可成立的情况。
字符串中“\\”表示反斜线“\”
同时,早正则匹配特殊字符时,也需要反斜线(\),对特殊字符进行转义。
*/
/*
模式修饰符,还可以根据实际需求多个组合在一起使用。
例如,既要忽视大小写又要进行全局匹配,则可以直接使用gi,并且在编写多个模式修饰符时没有顺序要求。
因此,模式修饰符的合理使用,可使正则表达式变得更加简洁、直观。
*/
</script>

