可以'我不能理解javascript's正则表达式有效

Can't make sense of the way javascript's regex works

本文关键字:正则表达式 有效 javascript 不能 可以 能理解      更新时间:2023-09-26

为什么这个代码(这里是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:,那它怎么会匹配呢?

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

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

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

将返回此数组:

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

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

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

将方便地返回此阵列:

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