在常规的JavaScript中我们用到最多的正则表达式操作是RegExp对象的test()方法。
但是此外,RegExp对象的exec()方法、String对象的search()方法、String对象的math()、String对象的replace()方法也是实际工作中极具价值的可选操作。当学习了正则表达式之后,在使用这些方法的时候,最容易给人带来困扰的一个元素就是"全局匹配"。
下面通过几个小例子来对此作出说明。
首先,在JavaScript中创建正则表达式的对象有几种方法。
var reg1 = /([A-Za-z]+)(?=\d+)/
var reg2 =new RegExp(/([A-Za-z]+)(?=\d+)/)
var reg3 = new RegExp("([A-Za-z]+)(?=\\d+)") //在使用字符串构造时,需要注意转义字符\的数量需要加倍。
也可以对已有的RegExp进行重新编译,var a = "([A-Za-z]+)(?!\\d+)";reg1.compile(a)
RegExp对象有一个属性global(只读),布尔类型,这个属性和另一个属性lastIndex(读、写)结合,将影响正则表达式的操作。
首先,建立一个正则表达式对象 var reg1 = /([A-Za-z]+)(?=\d)/g或者var reg1 =new RegExp("([A-Za-z]+)(?=\\d+)","g")这个表达式的意思是:一个以上想大小写字母(后面紧跟至少一个数字)。该reg1设定global为true。
另外建立一个正则表达式对象 该reg2设定global为false。var reg2 = /([A-Za-z]+)(?=\d)/
建立一个字符串,用于测试。var str = "abc12def34gh5kl"
下面将一一解释在开头出现的几种正则表达式应用的方法。
1 RegExp对象的test()方法。
首先使用reg1来测试:
reg1.lastIndex
0
reg1.test(str)
true
reg1.lastIndex
3
reg1.test(str)
true
reg1.lastIndex
8
reg1.test(str)
true
reg1.lastIndex
12
reg1.test(str)
false
reg1.lastIndex
0
......
在设置了参数global的情况下,每次执行test()方法之后,lastIndex值将会改变,下一次执行test()时,将会从lastIndex指定的索引处开始匹配。只有匹配失败时,lastIndex会重新设为0。当然,可以手动设置lastIndex
的值。
然后使用reg2来测试
reg2.lastIndex
0
reg2.test(str)
true
reg2.lastIndex
0
reg2.test(str)
true
可以看到在不设置参数global的情况下,每次执行test()方法之后,lastIndex值始终为0,下一次执行test()时,将会从lastIndex指定的索引处开始匹配。
因此,可以看出在设置了参数global的情况下,使用RegExp对象的test方法,结果会被影响。
2 RegExp对象的exec()方法。
该方法和test方法相似,不同的是返回值。exec的返回值是一个数组。数组的第0个值为本次匹配的结果,第1-n个值为子匹配的结果(正则表达式中小括号中的内容,会作为子匹配提供,如果不希望匹配,可以使用(?:[A-Za-z]+)代替)。
reg1.lastIndex=0
0
reg1.exec(str)
["abc","abc"]
reg1.lastIndex
3
reg1.exec(str)
def", " def "]
reg1.lastIndex
8
reg1.exec(str)
gh", " gh "]
reg1.lastIndex
12
reg1.exec(str)
null
reg1.lastIndex
0
exec方法返回一个数组,该数组用属性index,input分别表示当地匹配结果在字符串中的索引位置、当前字符串。
reg1.lastIndex
0
var arr = reg1.exec(str)
undefined
arr
["abc","abc"]
arr.input
"abc12def34gh5kl"
arr.index
0
arr[0]
"abc"
var arr = reg1.exec(str)
undefined
arr
[" def "," def"]
arr.input
"abc12def34gh5kl"
arr.index
5
arr[0]
"def"
3 String对象的match()方法。
设置参数global的情况下,返回所有匹配结果的数组(不包括字匹配)。未设置参数global的情况下,和RegExp对象的exec方法很像,返回数组的第0个值为本次匹配的结果,第1-n个值为子匹配的结果。
str.match(reg1)
[" abc "," def","gh"]
str.match(reg2)
[" abc "," abc"]
4 String对象的search方法
global的影响。无匹配时返回-1