学科分类
目录
JavaScript网页编程

括号字符

在正则表达式中,中括号“[]”表示字符集合,匹配中括号里的任意字符;大括号“{}”表示量词符,能够完成某个字符连续出现的匹配;小括号“()”表示优先级,被括起来的内容称为“子表达式”。

小括号“()”字符在正则表达式中的作用非常强大,下面我们就来进行讲解。

1. 改变限定符的作用范围

下面我们通过代码对比使用小括号与不使用小括号的区别。

① 改变作用范围前 正则表达式:catch|er 可匹配的结果:catch、er ② 改变作用范围后 正则表达式:cat(ch|er) 可匹配的结果:catch、cater

从上述示例可知,小括号实现了匹配catch和cater,而如果不使用小括号,则变成了catch和er。

2. 分组

使用小括号可以进行分组,当小括号后面有量词符时,就表示对整个组进行操作。下面我们通过代码对比演示。

① 分组前 正则表达式:abc{2} 可匹配的结果:abcc ② 分组后 正则表达式: a(bc){2} 可匹配的结果:abcbc

在上述示例中,未分组时,表示匹配2个c字符;而分组后,表示匹配2个“bc”字符串。

3. 捕获与非捕获

正则表达式中,当子表达式匹配到相应的内容时,系统会自动捕获这个匹配的行为,然后将子表达式匹配到的内容存储到系统的缓存区中,这个过程就称为“捕获”。

在利用match()进行捕获时,其返回结果中会包含子表达式的匹配结果,示例如下。

var res = '1234'.match(/(\d)(\d)(\d)(\d)/);

console.log(res);

可在浏览器的控制台中查看捕获的结果,效果如图1所示。

img

图1 获取存放在缓存区内的捕获内容

如图1所示,match()方法返回值中下标为1的元素保存第1个子表达式的捕获内容,下标为2的元素保存第2个子表达式的捕获内容,依次类推,即可得到所有的捕获内容。

另外,还可以通过String对象的replace()方法,直接利用$n(n是大于0的正整数)的方式获取捕获内容,完成对子表达式捕获的内容进行替换的操作。下面我们以颠倒字符串“Regular Capture”中两个单词的顺序为例进行演示,具体代码如下。

var str = 'Regular Capture';**

**var reg = /(\w+)\s(\w+)/gi;**

**var newstr = str.replace(reg, '$2 $1');**

**console.log(newstr); //** **输出结果为:****Capture Regular**

在上述代码中,replace()方法的第1个参数为正则表达式,用于与str字符串进行匹配,将符合规则的内容利用第2个参数设置的内容进行替换。其中,$2表示reg正则表达式中第2个子表达式被捕获的内容“Capture”,$1表示第1个子表达式被捕获的内容“Regular”。replace()方法的返回值是替换后的新字符串,因此,并不会修改原字符串的内容。

除此之外,若要在开发中不想将子表达式的匹配内容存放到系统的缓存中,则可以使用“(?:x)”的方式实现非捕获匹配。捕获与非捕获的实现对比如下所示。

// ① 非捕获 var reg = /(?:J)(?:S)/; var res = 'JS'.replace(reg,'$2 $1'); console.log(res); // 输出结果:$2 $1 // ② 捕获 var reg = /(J)(S)/; var res = 'JS'.replace(reg,'$2 $1'); console.log(res); // 输出结果:S J

从上述代码可以清晰地看出,捕获后可以通过$n的方式获取到子表达式匹配到的内容;而非捕获后,不能通过其他的方式获取子表达式匹配到的内容。

点击此处
隐藏目录