正则表达式一向作为我的痛点,没有体系的进修和相识,之前部门有本500多页的书叫《通晓正则表达式》,一向没勇气拿起来。到厥后营业中须要正则的处所越来越多,不忍心老找人帮助写正则了。找了材料先看着,最少本身先入个门。
with (javascript)
实例化RegExp对象
实例化RegExp对象同实例化其他JavaScript内置对象一样,离别有字面量和组织函数两种要领:
var reg1 = /\d/g; //全局婚配数字
var reg2 = new RegExp("\\D","g"); //全局婚配非数字
RegExp对象原型要领
相似Array/String/Function都有本身的原型要领,RexExp对象一样有本身的原型要领。
test
不论正则6不6,test要领一建都会用:RegExpObject.test(string);
string
中是不是含有RegExpObject
中婚配的字符串片断,有则返回true,不然返回false
/\d/g.test("abc"); //false
/\d/g.test("123"); //true
exec
这个要领很壮大,然则明白起来有点难,简单说,用法是: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;假如全部正则没有婚配效果,仅仅个中某个分组有婚配效果,则exec的返回值为null。所以
test
要领也能够运用RegExpObject.exec(string) != null;
来替换;假如个中某个分组有多个婚配效果,比方:我们str1改
"a1B2老cd3李e45好";
那末(大小写字母连着一个数字)
这个分组就有多个婚配效果,a1
和B2
;那末返回到数组中的是末了一个婚配胜利的效果,也就是B2;假如正则是一个全局的正则表达式(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
toString
要领同Object
的toString
要领;将RegExp对象转为字符串。
var reg3 = /\d/g;
var reg4 = new RegExp("\\d","g");
reg3.toString(); //"/\d/g"
reg4.toString(); //"/\d/g"
RegExp对象属性
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