1

为什么这段代码(这里是 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: (.*)/如果它不包含 a怎么匹配T:

4

2 回答 2

3

第二个是全局正则表达式,因此返回的数组是字符串中表达式的所有匹配项的列表。第一个不是,所以它是一个组列表,就像你从exec. (第 0 组是整个比赛,第 1 组是唯一带括号的……组。)

于 2012-12-24T04:13:29.903 回答
1

让您失望的是您从带有和不带有g标志的正则表达式中获得的不同行为。String.match使用标记的正则表达式调用g将返回String对象内所有模式实例的数组。例如,表达式:

"Hello World!".match(/l/g);

将返回此数组:

["l", "l", "l"]

但是,在没有标志的情况下调用相同的函数g将返回一个数组,其第一个元素是匹配的模式。此后的任何元素都将匹配括号内的每个表达式。例如,表达式:

"Hello World!".match(/(Hell)o World(!)/);

将方便地返回此数组:

["Hello World!", "Hell", "!"]

于 2012-12-24T04:40:31.007 回答