Javascript 正则表达式之全局匹配

         在常规的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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值