为什么这个RegEx必须用括号括起来匹配?

时间:2014-12-02 21:07:35

标签: javascript regex

我从this RegExp开始:

 /<!--#\s*include\s+file=(['"])([^\r\n]+?)\1\s*-->/g

我希望它能匹配这两行:

<!--#include file="../header.html"-->
<!--#include virtual="../header.html"-->

在我的第一次尝试中,我将file改为(file|virtual),如此:

/<!--#\s*include\s+(file|virtual)=(['"])([^\r\n]+?)\1\s*-->/g

但是,这与任何事都不相符。经过一番玩耍后,我发现在所有内容中添加括号将得到一个匹配:

/(<!--#\s*include\s+(file|virtual)=(['"])([^\r\n]+?)\1\s*-->)/g

我不明白为什么 - 为什么没有第一次修改匹配,为什么额外的括号修复它?

1 个答案:

答案 0 :(得分:1)

我想通了 - 它是靠近结尾的\1后退参考 - 它应该与开头(['"])匹配,最后用相同的引号。但是当我添加一个额外的捕获组时,它正在文件路径的末尾寻找第二个(file|virtual)

修复方法是将其更改为\2

这是更正的RegExp:

/<!--#\s*include\s+(file|virtual)=(['"])([^\r\n]+?)\2\s*-->/g