首先来解释一下反向引用的概念
\num --它代表表达式的第n个子匹配结果,应用于表达式中。例如\1就代表第一个匹配结果,\2就代表第2个匹配结果。
$num --它同样代表表达式的第n个匹配结果,与\num不同的是,它应用于替换表达式中。
下面我们看代码
一、反向引用 \num
<!DOCTYPE html>
<html>
<head>
<title>反向引用\num</title>
</head>
<body>
<script type="text/javascript">
var str = '1122 3434 5566 7879 9887';
//请匹配出连续的四个数字,要求第一和第二数字相同,第三和第四数字相同
var res = str.match(/(\d)\1(\d)\2/g);
// 解释一下以上表达式
// \1代表第一个子匹配项,即第一个小括号匹配的内容,所以(\d)\1 代表两个连续的数字
// \2同理,所以(\d)\1(\d)\2代表4个连续的数字,第一个数字和第二个数字一样,第三个和第四个数字一样。
console.log(res);// [1122 , 5566]
//匹配连续四个数字,第一和第三数字相同,第二和第四数字相同
var res = str.match(/(\d)(\d)\1\2/g);
console.log(res); //[3434]
//匹配连续四个数字,第一和第三数字相同
var res = str.match(/(\d)\d\1\d/g);
console.log(res); //[3434 , 7879]
</script>
</body>
</html>
二、引用替换 $num
<!DOCTYPE html>
<html>
<head>
<title>反向引用$num</title>
</head>
<body>
<script type="text/javascript">
var str = '1122 3434 5566 7879 9887';
//请在以上的字符串中匹配出连续的四个数字,要求第一和第二数字相同,第三和第四数字相同,并将相同的数字只保留一个
//例如:匹配到1122则为12,匹配到5566则为56
var res = str.replace(/(\d)\1(\d)\2/g, '$1$2');
//解释一下以上的表达式
//(\d)\1(\d)\2表示匹配连续的4个数字,前两个相同,后两个相同
//由于我们的要求是:重复的数字只保留一个,所以使用replace替换来实现
//该替换方法的意思是:将前面正则表达式匹配到的内容替换为后面的$1$2所代表的内容
//$1代表的是前面的第一个子匹配项,即第一个(\d),$2代表第二个子匹配项,即第二个(\d),所以$1$2等于(\d)(\d)
//这样一来,就去除了重复的数字
//执行结果为12 3434 56 7879 9887,因为1122和5566符合我们的正则规则,然后执行替换结果即是12 3434 56 7879 9887
console.log(res);
</script>
</body>
</html>
三、禁止反向引用
<!DOCTYPE html>
<html>
<head>
<title>反向引用$num</title>
</head>
<body>
<script type="text/javascript">
//禁止反向引用 (?
//表示?:所在小括号中的子匹配项不参与反向引用
var str = '1122 3434 5566 7879 9887';
var res = str.match(/(?:\d)(\d)\1\d/g);
//解释
//(?:\d)(\d)\1\d 其中的\1表示的不再是第1个小括号的匹配结果,而是第2个小括号的匹配结果,因为第一个小括号不参与反向引用
//所以,该表达式的含义为:匹配连续的4个数字,要求第2个和第3个相同
console.log(res); //[9887]
</script>
</body>
</html>
以上语法是正则表达式中非常重要的语法,被广泛应用于伪静态规则的编写中,请大家多练习多理解。
|