您的位置:首页 > Web前端 > JavaScript

Javascript 正则表达式之全局匹配

2013-07-05 16:07 399 查看
         在常规的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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息