在Javascript中,使用正则表达式有两种方法,一是通过String调用正则表达式,二是通过正则表达式拆分字符串,在大部分的情况下,它们的表现类似,都可以轻松实现测试字符串的功能,如下:
var text = '[DTools] [logs] [Program Files]',
// 正则表达式,注意g的使用
pattern = /\[([^\]]+)\]/g
// 正则表达式方法
console.log(pattern.test(text))
// 字符串方法
console.log(text.match(pattern) != null)
对于String的方法与正则表达式的方法(共两个,一是exec,二是test),最大的差异在于正则表达式的方法在携带“g”标志的情况下,在返回的结果中会记住上次字符串检索的位置(lastIndex),并体现在第二次的搜索过程中(以index属性的方式),exec()第二次搜索结果示例如下:
0:"[logs]"
1:"logs"
# 本次搜索从这里开始
index:22
input:"[DTools] [logs] [Program Files]"
length:2
针对上述的差异,所以我们可以使用正则表达式exec()执行更细粒度的复合操作,比如既检索出所有匹配的字符串,又检索出所有匹配字符串的分组信息,而这一点恰恰是字符串的方法无法做到的。
继续以第一段代码为例,如果要找出所有“[]”包含的字符串,如果采用String的match()方法,我们需要进行两次正则表达式匹配,如下:
var text = '[DTools] [logs] [Program Files]',
pattern = /\[([^\]]+)\]/g,
results = text.match(pattern)
// 第一步的输出结果是["[DTools]", "[logs]", "[Program Files]"]
if(results != null) {
var contentPat = /[^\[\]]+/,
values = []
results.forEach(function(item) {
// 必须再进行一次正则匹配
console.log(item.match(contentPat)[0])
})
}
如果改用正则表达式的exec方法,则只需要一个正则表达式,如下:
var text = '[DTools] [logs] [Program Files]',
pattern = /\[([^\]]+)\]/g
// 能记住上次匹配的位置,所以能进行循环
while((result = pattern.exec(text)) != null) {
console.log(result[1])
}
结论
在正则表达式的应用中,String的方法可以一次匹配多个模式,但难以深入下一个层次,而正则表达式的exec()则可以充分利用正则表达式的全局匹配,循环获取多层次的分组信息。