Can';不理解javascript的方式';s regex工厂

Can';不理解javascript的方式';s regex工厂,javascript,regex,Javascript,Regex,为什么这个代码(): 这个代码(注意我添加了g选项): 我甚至不明白为什么第一个代码记录为第二个匹配。如果/T:(.*)/不包含T:,那么这是如何匹配的?第二个是全局正则表达式,因此返回的数组是字符串中表达式的所有匹配项的列表。第一个不是,所以它是一个组列表,就像您从exec中得到的一样。(组0是整个匹配项,组1是唯一带括号的…组。)第二个是全局正则表达式,因此返回的数组是字符串中表达式的所有匹配项的列表。第一个不是,所以它是一个组列表,就像您从exec中得到的一样。(第0组是整个匹配项,第1组

为什么这个代码():

这个代码(注意我添加了
g
选项):


我甚至不明白为什么第一个代码记录为第二个匹配。如果
/T:(.*)/
不包含
T:
,那么这是如何匹配的?

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

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

让你感到不舒服的是,在带有和不带
g
标志的正则表达式中,你会得到不同的行为。调用带有标记的正则表达式的
String.match
将返回
String
对象中模式的所有实例的数组。例如,表达式:

“你好,世界!”。匹配(/l/g)

将返回此数组:

[“l”、“l”、“l”]

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

“你好,世界!”。匹配(/(地狱)哦,世界(!)/)

将方便地返回此数组:


[“Hello World!”、“Hell”、“!”]

让你感到不舒服的是,在带有和不带
g
标志的正则表达式中,你会得到不同的行为。调用带有标记的正则表达式的
String.match
将返回
String
对象中模式的所有实例的数组。例如,表达式:

“你好,世界!”。匹配(/l/g)

将返回此数组:

[“l”、“l”、“l”]

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

“你好,世界!”。匹配(/(地狱)哦,世界(!)/)

将方便地返回此数组:


[“你好,世界!”,“地狱”,“!”]

奖金问题:你如何得到一个组列表,就像OP半预期的那样?@cHao:
exec
在循环中或
替换
,我想<代码>替换
很有趣:
var result=[];replace(regex2,function(){result.push.apply(result,arguments);})奖金问题:你如何得到一个组列表,就像OP半预期的那样?@cHao:
exec
在循环中还是
replace
,我想<代码>替换
很有趣:
var result=[];replace(regex2,function(){result.push.apply(result,arguments);})
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
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