正则:非获取匹配

假设我们有下面这样一段文本,而我们想要获取的 Windows 的所有版本,我们可以这样写:

(Windows [\w.]+\b)

效果演示

Windows 1.03 and Windows 2.0 fisrt Released in 1985 and 1987 respectively. 
Windows 95 and Windows 98 are the successor. 
Then Windows 2000 and Windows Xp appeared. 
Windows Vista is the Latest version of the family. 

本例代码

function reg_replace()
{
	var test = document.getElementById("test");
	var regex = /(Windows [\w.]+\b)/g;
	test.innerHTML = test.innerHTML.replace(regex,"$1");
}

这时,如果我们想将所有的 Windows,全部换成简写 Win,并去掉 Windows 与 版本号 之间的空格,我们则需要使用后向引用:

Windows ([\w.]+\b) 

我们首先查看一下表达式的区别,为了要使用后向引用,我们用“(”和“)”把“[\w.]+\b”包起来,使它成为一个子模式。我们知道,只有这样,才可以用 $1 去引用它,这里,我们发现使用子模式的一个作用:系统会在幕后将所有的子模式保存起来,以供后向引用使用(包含查找时的后向引用 和 替换时的后向引用)。

而很多时候,我们添加一个子模式,并不是为了在后向引用中获取它,我们或许是出于匹配需要,或许简单的只是为了使表达式更清晰

正则表达式中,可以在子模式内部前面加“?:”来表示这个子模式是一个 非获取匹配,非获取匹配不会被保存,不能在后向引用中获取

由于子模式没有被保存,所以“$1”被当作一个普通字符进行了处理。如果我们只是进行查找匹配,不进行替换,那么它们返回的效果相同。可见,所谓 非获取匹配,意思就是说它只进行匹配,并不保存结果供以后引用。


你可能感兴趣的:(正则:非获取匹配)