无法理解javascript的正则表达式的工作方式

时间:2012-12-24 04:11:09

标签: javascript regex

为什么这段代码(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:,那该匹配是怎么回事?

2 个答案:

答案 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", "!"]