正则表达式一直做为个人痛点,没有系统的学习和了解,以前部门有本500多页的书叫《精通正则表达式》,一直没勇气拿起来。到后来业务中须要正则的地方愈来愈多,不忍心老找人帮忙写正则了。找了资料先看着,至少本身先入个门。javascript
with (javascript)
java
实例化RegExp对象同实例化其余JavaScript内置对象同样,分别有字面量和构造函数两种方法:正则表达式
var reg1 = /\d/g; //全局匹配数字 var reg2 = new RegExp("\\D","g"); //全局匹配非数字
相似Array/String/Function都有本身的原型方法,RexExp对象一样有本身的原型方法。segmentfault
无论正则6不6,test方法必定都会用:RegExpObject.test(string);
string
中是否含有RegExpObject
中匹配的字符串片断,有则返回true,不然返回false数组
/\d/g.test("abc"); //false /\d/g.test("123"); //true
这个方法很强大,可是理解起来有点难,简单说,用法是:RegExpObject.exec(string);
这个和test同样,返回值是返回一个数组或者null,也就是说RegExpObject
在string
中成功匹配到了字符串片断,则返回一个数组,这个数组各项分别是:函数
[ 0: "与正则表达式匹配的文本", 1: "与正则表达式第一个分组匹配的文本", //分组就先理解为一个括号为一个分组 2:" 与正则表达式第二个分组匹配的文本", 3: "···以此类推" ] //来个例子: var reg1 = /([a-zA-Z]\d)+([\u4e00-\u9fa5])+/; //匹配 (大小写字母连着一个数字) 至少一次 (再连着汉字) 至少一次 var str1 = "a11B2老cd3李e45好"; var result = reg1.exec(str1); console.log(result); //["B2老", "B2", "老"]
例子中正则匹配数字的结果是"B2老"
;因此结果数组中第一个元素为"B2老"
,第一个分组是(大小写字母连着一个数字),第二个元素就是"B2"
,第二个分组是汉字,第三个元素就是"老"
。同时,这里有几个重点要划:学习
返回结果的数组自带另外两个属性:index
:匹配成功字符串片断的起始index; input
:存放被检测的字符串,也就是例子中的str1;code
若是整个正则没有匹配结果,仅仅其中某个分组有匹配结果,则exec的返回值为null。因此test
方法也可使用RegExpObject.exec(string) != null;
来替代;对象
若是其中某个分组有多个匹配结果,例如:咱们str1改"a1B2老cd3李e45好";
那么 (大小写字母连着一个数字)
这个分组就有多个匹配结果,a1
和B2
;那么返回到数组中的是最后一个匹配成功的结果,也就是B2;ip
若是正则是一个全局的正则表达式(global);那么返回值数组会首先取第一段匹配成功的结果输出,而后第二次执行会取第二段,依次循环类推,例如:
var reg2 = /([a-zA-Z]\d)+([\u4e00-\u9fa5])+/g; //匹配 (大小写字母连着一个数字) 至少一次 (再连着汉字) 至少一次 var str2 = "a11B2老cd3李e45好"; var result1 = reg2.exec(str2); var result2 = reg2.exec(str2); var result3 = reg2.exec(str2); console.log(result1,result2,result3); //输出: ["B2老", "B2", "老"] //index: 3 ["d3李", "d3", "李"] //index: 7 null
方法同Object
的toString
方法;将RegExp对象转为字符串。
var reg3 = /\d/g; var reg4 = new RegExp("\\d","g"); reg3.toString(); //"/\d/g" reg4.toString(); //"/\d/g"
global:
只读,简写g;
被设置则表示全局搜索,即在字符串中查找到全部匹配条件的字符串片断,不设置的话匹配到第一个成功的即中止;
ignoreCase:
只读,简写i;
不区分大小写;
multiline:
只读,简写m;
多行匹配,字符串中带有换行符时,若是不设置i
属性,则只匹配第一行,设置后全部行均匹配且每行的开头/结尾能够做为开头/结尾被匹配(^/$
);
source:
只读,返回正则表达式的文本,简单说,上例中的正则表达式/([a-zA-Z]\d)+([\u4e00-\u9fa5])+/gim
,去掉两边的斜杠和斜杠外的东西//gim
,结果就是([a-zA-Z]\d)+([\u4e00-\u9fa5])+
;
lastIndex:
读写,在全局正则表达式的前提下,上一次匹配成功的文本片断的最后一个字符以后一个文本的位置,也是下一次匹配的起始位置,初始为0,无匹配结果时置为0。例:
var reg5 = /\d/g; var str5 = "a1bc2e3fj"; console.log(reg5.lastIndex); //0 console.log(reg5.test(str5), reg5.lastIndex); //true 2 console.log(reg5.test(str5), reg5.lastIndex); //true 5 console.log(reg5.test(str5), reg5.lastIndex); //true 7 console.log(reg5.test(str5), reg5.lastIndex); //false 0 console.log(reg5.test(str5), reg5.lastIndex); //true 2 console.log(reg5.test(str5), reg5.lastIndex); //true 5
在第5行中,结果为false,由于第四行中的匹配成功后,lastIndex为7,也就是下一次是从f开始匹配,因此匹配失败,返回false,并把lastIndex置为0