wei*_*lou 8 javascript regex string match gflags
在"JavaScript:The Good Parts"一书中,它解释了string.match(regexp)如下方法:
match方法匹配字符串和正则表达式.它是如何做到这取决于g标志.如果没有g标志,那么调用string .match(regexp)的结果与调用regexp .exec(string)相同.但是,如果正则表达式具有g标志,则它会生成所有匹配的数组,但不包括捕获组:
然后这本书提供了代码示例:
var text = '<html><body bgcolor=linen><p>This is <b>bold<\/b>!<\/p><\/body><\/html>';
var tags = /[^<>]+|<(\/?)([A-Za-z]+)([^<>]*)>/g;
var a, i;
a = text.match(tags);
for (i = 0; i < a.length; i += 1) {
document.writeln(('// [' + i + '] ' + a[i]).entityify());
}
// The result is
// [0] <html>
// [1] <body bgcolor=linen>
// [2] <p>
// [3] This is
// [4] <b>
// [5] bold
// [6] </b>
// [7] !
// [8] </p>
// [9] </body>
// [10] </html>
Run Code Online (Sandbox Code Playgroud)
我的问题是,我无法理解"但不包括捕获群体".
在上面的代码示例,html在</html>处于捕获组.为什么它仍然包含在结果数组中?
并且/在</html>也是一个捕获组.为什么它包含在结果数组中?
你可以用上面的代码示例解释"但是排除捕获组"吗?
非常感谢你!
T.J*_*der 10
在上面的代码示例中,html位于捕获组中.为什么它仍然包含在结果数组中?
因为这是完全匹配.当他说"但不包括捕获组"时,他并不意味着完全匹配结果,只是捕获组的内容不会在数组中重复.如果包括捕获组,你会看到
// The result is
// [0] <html>
// [1] // From the capture group; nothing here
// [2] html // From the capture group
// [3] // From the capture group; nothing here
// ...
Run Code Online (Sandbox Code Playgroud)
和/在同一个捕获组中.为什么它包含在结果数组中?
出于与上述相同的原因:它是整体匹配的一部分,这就是结果中的内容; 个别捕获组的内容不是.
使用更简单的示例更容易理解.考虑以下代码:
var s = "test1 test2";
var re = /(test)(.)/g;
var r = s.match(re);
var i;
for (i = 0; i < r.length; ++i) {
console.log("[" + i + "]: '" + r[i] + "'");
}
Run Code Online (Sandbox Code Playgroud)
因为正则表达式具有g标志,所以只有完整匹配包含在数组中,因此我们看到:
[0]: 'test1' [1]: 'test2'
在每种情况下,数组中的条目都是完全匹配,其中包括组成整个表达式的捕获组中匹配的字符.
如果我们删除了g标志但没有改变任何其他内容,我们将获得第一个完整匹配,然后是两个捕获组的内容:
[0]: 'test1' // The full match, including the stuff from each capture group [1]: 'test' // Capture group 0's contents [2]: '1' // Capture group 1's contents
在那里,第一个条目是完全匹配; 然后第二个和第三个是捕获组的内容.请注意捕获的内容