正则表达式在JavaScript中,提供了一种内置的构造函数--RegExp.
正则表达式有三种匹配模式:正则表达式
var reg=/bt/gim; ----注释: /bt/ 两个斜杠中表示的是匹配项。而 gim表示匹配模式,g i m 三种匹配模式能够写一种或几种,也能够不写。
var reg=new RegExp("bt","gim");//---注释 第一个参数是字符串匹配项,第二种表示匹配模式。
两种方式在初始化正则表达式的时候所得的结果,几乎相同。除了一点----- 第二种在出现元字符的时候须要转义.数组
正则表达式的元字符均须要转义:函数
( [ { \ ^ $ | ) ? * + .] } 这14中字符在表示的时候均与要转义,由于他们在正则表达式中均有其本身的含义。spa
关于正则表达式的匹配项的意义,这里只列举比较少见的几种。详情参见----正则表达式语法 code
/* 第一种演示(X|Y)*/
var str = 'iam007'; var reg = /^([a-z]|\d)/; //匹配以数字或者是字母开头的字符串 var result = reg.exec(str); console.log(result[1]); //---结果:i
/*第二种 演示(?:X|Y)*/
var str = 'iam007';
var reg = /^(?:[a-z]|\d)/;
var result = reg.exec(str);
console.log(result[1]); //undefinedregexp
var str = 'iam007';
var reg = /(?=[a-z])(\w)/g; var result = reg.exec(str); while (result && result.length) { console.log(result[1]); result = reg.exec(str); } //第一次匹配从i开始,第二次匹配从a开始,第三个匹配从m开始,第四次则无匹配项,输出结果 :----i a m;
var str = 'iam007';
var reg = /(\w)(?![a-z])\d/g; var result = reg.exec(str); while (result && result.length) { console.log(result[1]); result = reg.exec(str); } // 输出结果 ---- m 0 第一次匹配(m00),第二次匹配(007).第三次无匹配项。
RegExp的每一个实例都有下列属性,经过这些属性能够获得正则表达式的各类信息。blog
这些属性,虽然包含在模式生命中,可是没有很大的做用,除了lastIndex外(只在global=true时更改才有效,当global=false时,即便更改,也是从index=0位置处开始搜索),其他的都不可更改,下面咱们举个例子来讲明lastIndex的用处。ip
var reg = /\w/g; var str = 'abcdefg'; var result = reg.exec(str); while (result && result.length) { console.log(result[0]); reg.lastIndex=reg.lastIndex+1; result = reg.exec(str); }//跳跃查询,实用处也不大。
RegExp构造函数有一些属性,请同RegExp实例的属性进行比较,讲着两部分主要是为了引出下一小节的内容。字符串
长属性名 | 短属性名 | 说明 |
input | $_ | 最近一次要匹配的字符串 |
lastMatch | $& | 最近一次匹配项(opera未实现此属性) |
leftContext | $` | input字符串被匹配项以前的文本 |
multiline | $* | 是否全部表达式都使用多行模式。IE和Opera还没有实现 |
rightContext | $' | input字符串被匹配项以后的文本 |
lastParen | $+ | 最近一次的捕获组.Opera未实现 |
补充属性: $+数字,表示被小括号捕获的项。get
这些值,能够从exec()和test()中提取出具体信息。----注:此正则表达式实例必须是字面量形式建立,才能够访问。
var text = 'hello world'; var reg = /\s/g; //匹配中间的空格 var result = reg.exec(text); for (var property in RegExp) { console.log('RegExp[' + property + ']=' + RegExp[property]); }
//输出结果
先来看一段代码比较:
var text = 'hello2world'; var reg = /\d/g; var result = reg.exec(text); console.log(RegExp.lastMatch);
reg=new RegExp("\\w","g");
result = reg.exec(text);
console.log(RegExp.lastMatch);//输出结果 2 h
由以上的输出结果,咱们知道,全部的正则表达式实例在使用的时候都会改变RegExp构造函数的属性, 因此在每一次正则表达式使用的时候咱们均可以经过RegExp构造函数的属性,来取得咱们想要的结果。
RegExpObject.exec(string)
参数 | 描述 | 返回值 |
string | 被检索的字符串 | 字符串数组 |
var text = 'hello2world2sad'; var reg = /\w*(\d)\w/; var result = reg.exec(text); console.log(result[0]);//hello2world2s 贪婪匹配 console.log(result[1]);//2 result = reg.exec(text); console.log(result[0]); // hello2world2s console.log(result[1]);//2 console.log(RegExp.$1) //2
语法:
RegExpObject.test(string)
参数 | 描述 | 返回值 |
string | 被检索的字符串 | 布尔值 |
var text = 'hello2world'; var reg = /\w*(\d)\w/; var result = reg.test(text); console.log(result); //true result = reg.test(text); console.log(result); //true console.log(RegExp.$1) //2
stringObject.match(searchvalue) stringObject.match(regexp)
语法:
参数 | 描述 | 返回值 |
seachValue | 字符串 | 数组 |
参数 | 描述 | 返回值 |
regexp | 正则表达式 | 数组 |
var text = 'hello2world2sad';
var reg = /\w*(\d)\w/;
var result = text.match(reg);
console.log(result[0]); //hello2world2s
console.log(result[1]); //2
result = text.match(reg);
console.log(result[0]); // hello2world2s
console.log(result[1]); //2
3.1总结:
在非全局模式下:
test()方法: 返回的老是布尔值,每次均从字符串首位开始检索字符串。
exec()方法: 返回值是数组,数组中保存的老是第一次的匹配结果,每次检索均是从字符串首位开始检索。
match()方法:返回值是数组,数组中保存的一次的匹配结果,每次检索均是从字符串首位开始检索,返回结果和exec()的结果老是一致的。
在非全局模式下,exec()和match()惟一的区别就是调用者和函数参数位置互换而已。
在全局模式下,每次检索字符串的时候都是从字符串上一次检索的结束位置开始检索,每次返回的数组,第一项是彻底匹配的项,第二项是捕获项!等于RegExp.$1,同时也改变RegExp构造函数的属性。
代码以下:
var text = 'hello1hello2hello3hello4hello5hello';
var reg = /[a-z]*(\d)/g; var result = reg.exec(text); console.log(result); //["hello1", "1"]
result = reg.exec(text); console.log(result); //["hello2", "2"]
因此,能够利用这种特性用正则表达式,遍历检索字符串。
var text = 'hello1hello2hello3hello4hello5hello';
var reg = /[a-z]*(\d)/g; var result = reg.test(text); while (result) { console.log(RegExp.$1); //1 2 3 4 5 result = reg.test(text); }
3.2总结:
在全局模式下:
test()方法: 返回的老是布尔值,每次均是从上一次检索后的位置开始检索字符串。
exec()方法: 返回值是数组,数组中保存的是每一次的匹配结果,每次均是从上一次检索后的位置开始检索字符串。
match()方法:返回值是数组,数组中保存的是全部的匹配结果,一次检索后,字符串会被检测完。下次在检索的时候,老是从字符串开头开始检索,两次返回的结果老是相同的。
在全局模式下,exec()和test()每次检索都是从上一次检索后的位置开始向后检索。而match()老是将全部匹配的结果保存在数组中。
split()函数的参数能够是字符串也能够是正则表达式。返回的结果老是数组
var text = 'hello1hello2hello3hello4hello5hello'; var reg = /\d/g; var result = text.split(reg); console.log(result); //hello ,hello ,hello, hello, hello
replace()函数的参数能够是字符串也能够是正则表达式,当其为正则表达式的时候,使用以下
var reg = /(^\s*|\s*$)/g //去掉字符串的开头和结尾空格
var hello = ' dasdasd ';
console.log(hello.replace(reg, '').length);
var reg = /(\w)/g //将字符串中小写换成大写
var hello = 'dasdasd';
console.log(hello.replace(reg, function () { return RegExp.$1.toUpperCase() })); //DASDASD