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
但是此外,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
相关文章推荐
- Javascript中正则表达式的全局匹配模式
- Javascript中正则表达式的全局匹配模式
- Javascript中正则表达式的全局匹配模式分析
- Javascript中正则表达式的全局匹配模式分析
- Javascript中正则表达式的全局匹配模式
- JavaScript基础插曲—元素样式,正则表达式,全局模式,提取数组
- JavaScript正则表达式的贪婪匹配和非贪婪匹配
- JavaScript:正则表达式 全局
- javascript正则表达式模糊匹配IP地址
- [拾贝] javascript 多行 正则表达式匹配
- JavaScript中的正则表达式对象4--重复匹配
- 常用正则表达式模式 -- 匹配 Javascript
- JavaScript中用正则表达式匹配URL
- Javascript Regular Expression Match 正则表达式的匹配
- JavaScript正则表达式匹配 div style标签
- 慎用正则表达式全局匹配(/g)
- JS全局正则表达式匹配同一字符串结果不一致
- javascript匹配js中注释的正则表达式代码
- javascript正则表达式模糊匹配IP地址功能示例
- JavaScript正则表达式之分组匹配 / 反向引用