正则表达式(Regular Expression),又称规则表达式,是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。它是一种文本模式(即字符串结构),该模式描述在搜索文本时要匹配的一个或多个字符串,通常被用来检索、替换那些符合某个模式(规则)的文本。
通过一个给定的正则表达式和一个字符串,可以达到:
①验证给定的字符串是否符合正则表达式的过滤逻辑(称作“匹配”);
②通过正则表达式,从字符串中 提取我们想要的特定部分,比字符串的split、replace等方法更方便;
创建正则表达式
①RegExp( )函数
var pat=new RegExp('a');//匹配包含a的字符串
var str=prompt("")
console.log(pat.test(str));
==>输入"abcd",返回
true
==>输入"bcd",返回
false
test( )是正则表达式里的一种方法,语法:规则.test(字符串); 返回一个布尔值
②字面量表达式
var pat=/a/ //匹配包含a的字符串
var str=prompt("")
console.log(pat.test(str));
==>输入"abc",返回
true
==>输入"bc",返回
false
二者的区别: ①字面量表达式在进行编译时就会自动新建正则表达式;②RegExp( )函数在运行时新建正则表达式;所以字面量表达式的效率更高,并且直观便利,所以在实际应用中,一般会使用字面量表达式。
var reg=new RegExp('abc',i)
//等价于
var reg=/abc/i;
var str=prompt()
var pat=new RegExp('')
console.log(pat.test(str));
修饰符 | 说明 |
---|---|
i | insensitive的缩写,定义不区分大小写字母 |
g | global的缩写,定义全局匹配,即在指定字符串范围内执行所有匹配 |
m | multiline的缩写,定义多行字符串匹配 |
var str='I like cats.'
var reg=/cat/ //验证是否包含cat
console.log(reg.test(str));
true
正则对象的lastIndex属性
var reg = /x/g;
var str = '_x_x_x';
console.dir(reg);//查看reg对象的方法
console.log(reg.lastIndex) // 0 第一次位置从0开始查找
console.log(reg.test(str)) // true
console.log(reg.lastIndex) // 2 上一次test搜索时,找到的值的位置是2
console.log(reg.test(str)) // true
console.log(reg.lastIndex) // 4
console.log(reg.test(str)) // true
console.log(reg.lastIndex) // 6
console.log(reg.test(str)) // false 搜索不到了
console.log(reg.lastIndex) // 0 lastIndex属性重置为0,回到位置0
console.log(reg.test(str)) // true 再次从0搜索
console.log(reg.lastIndex) // 2 第二轮搜索
g修饰符,表示全局搜索,会返回多个结果。上面五次使用test方法,每一次开始搜索的位置都是上一次匹配的后一个位置。
var reg=/x/g
var str='_x_x'
reg.lastIndex=4
console.log(reg.test(str));//false
console.log(reg.lastIndex);//0
console.log(reg.test(str));//true
指定从字符串的第五个位置开始搜索,这个位置为空,所以返回false。同时,lastIndex属性重置为0,所以第二次执行r.test(s)会返回true。
注意: 带有g修饰符时,正则表达式内部会记住上一次的lastIndex属性,这时不应该更换所要匹配的字符串,否则会有一些难以察觉的错误。
var reg = /aa/g;
reg.test('aa') // true
reg.test('-aa-') // false
上面代码中,由于正则表达式reg是从上一次的lastIndex位置开始匹配,导致第二次执行test方法时出现预期以外的结果。
exec方法用于返回匹配结果,当匹配到时,返回一个数组,数组元素是匹配到的子字符串;当没有匹配到时,返回null。
var str=prompt()
var pat=/a/g
console.log(pat.exec(str));
==>输入"abcd",返回
exec方法返回数组的两个属性:
>input:整个原字符串;
>index:匹配到的子字符串的开始位置(从0开始计数);
如果正则表达式包含圆括号(即含有“组匹配”)时,返回的数组会包括多个成员
>第一个成员:整个匹配成功的结果,后面的成员就是圆括号对应的匹配成功的组;
>第二个成员:对应第一个括号;
>第三个成员:对应第二个括号,以此类推;
>整个数组的length属性:等于组匹配的数量再加1;
var str='_x_x';
var reg=/_(x)/;
console.log(reg.exec(str))
exec( )方法和字符串的match( )方法的区别:
>非全局模式下:exec( )方法返回的数组与String.match( )方法返回的数组是相同的;
>全局模式下:exec( )方法与String.match( )方法返回的结果不同。当调用 exec( )方法 时,会为正则表达式对象定义lastIndex属性,执行下一次匹配的起始位置,同时返回匹配数组,与非全局模式下的数组结构相同;而 String.match( ) 仅返回匹配文本组成的数组,没有附加信息。
所以,在全局模式下获取完整的匹配信息只能用exec( )方法。