为什么这段代码(here's the JSBin):
var text = "T: 01202 870738";
var regex1 = /T: (.*)/;
var matches1 = text.match(regex1);
for(var i = 0; i < matches1.length; i++) {
log("[" + i + "]: " + matches1[i]);
}
记录下来:
[0]: T: 01202 870738
[1]: 01202 870738
和此代码(注意我添加了g
选项):
var regex2 = /T: (.*)/g;
var matches2 = text.match(regex2);
for(var i = 0; i < matches2.length; i++) {
log("[" + i + "]: " + matches2[i]);
}
记录下来:
[0]: T: 01202 870738
我实际上甚至不理解为什么第一个代码将01202 870738
记录为第二个匹配。如果/T: (.*)/
不包含T:
,那该匹配是怎么回事?
答案 0 :(得分:3)
第二个是全局正则表达式,因此返回的数组是字符串中表达式的所有匹配项的列表。第一个不是,所以它是一个组列表,就像你从exec
得到的那样。 (第0组是整个匹配,第1组是唯一的括号...组。)
答案 1 :(得分:1)
让你失望的是你在带有和不带g
标志的正则表达式中获得的不同行为。使用String.match
标记的正则表达式调用g
将返回String
对象中所有模式实例的数组。例如,表达式:
"Hello World!".match(/l/g);
将返回此数组:
["l", "l", "l"]
但是,在没有g
标志的情况下调用相同的函数将返回一个数组,其第一个元素是匹配的模式。此后的任何元素都将匹配括号内的每个表达式。例如,表达式:
"Hello World!".match(/(Hell)o World(!)/);
将方便地返回此数组:
["Hello World!", "Hell", "!"]