Javascript exec()的returend数组的含义是什么

Javascript exec()的returend数组的含义是什么,javascript,regex,Javascript,Regex,例如,有一个简单的正则表达式: var regex = /([^\\^\{^\}]+)|(\\[A-Za-z]+(\{[^}^{]*})*)|($[.]+$)|($$[.]+$$)/g; 和要检查的字符串: var text = '\\a{b}{c}{d}'; 在开关上运行函数var matched=regex.exec(text)。 返回的数组machted现在看起来像: matched =['\\a{b}{c}{d}', undefined, '\\a{b}{c}{d}', '{d}',

例如,有一个简单的正则表达式:

var regex = /([^\\^\{^\}]+)|(\\[A-Za-z]+(\{[^}^{]*})*)|($[.]+$)|($$[.]+$$)/g;
和要检查的字符串:

var text = '\\a{b}{c}{d}';
在开关上运行函数
var matched=regex.exec(text)
。 返回的数组
machted
现在看起来像:

matched =['\\a{b}{c}{d}', undefined, '\\a{b}{c}{d}', '{d}', undefined, undefined];
单个条目是什么意思?如何控制它们

提前谢谢

这就是工作原理

()
字符中的
regex
内容中的组在返回的数组中创建元素

var regex = /([^\\^\{^\}]+)|(\\[A-Za-z]+(\{[^}^{]*})*)|($[.]+$)|($$[.]+$$)/;
regex.exec('\\a{b}{c}{d}');
//=> ["\a{b}{c}{d}", undefined, "\a{b}{c}{d}", "{d}", undefined, undefined]
结果数组包含匹配的组,其中数组的第一个元素是匹配正则表达式的整个输入

undefined
表示您的一些组没有匹配任何内容,仍然为空

您可以使用**非捕获组并避免未定义:

var regex = /(?:[^\\^\{^}]+)|(\\[A-Za-z]+(\{[^}^{]*})*)|(?:$[.]+$)|(?:$$[.]+$$)/;
regex.exec('\\a{b}{c}{d}');
//=> ["\a{b}{c}{d}", "\a{b}{c}{d}", "{d}"]

第0个元素是完全匹配的子字符串,以下元素是由捕获组匹配的子字符串
(..)
。举一个简单的例子:


/(c)|(b(.)。/.exec('abcdef')
应返回
['bcd',未定义,'bc','c']
。模式是
(c)
(b(.))之间的交替<代码>“bcd”
出现在
“c”
之前,因此第二个选项匹配,而第一个选项不匹配。因此,第一个捕获组
(c)
未定义,因为它不匹配任何内容。第二个捕获组
(b(.)
匹配
“bc”
。第三个,
(.)
,匹配了
“c”

,让我们从一个更简单的例子开始:

var text = 'azrt12345';
var regex = /([a-z]+)|([0-9]+)/;
var matched = regex.exec(text);
/* matched = ["azrt", "azrt", undefined] */
如您所见,regexp捕获一个字母字符串或一个数字字符串。由于
text
以字母字符开头,第一个捕获组有效,而不是第二个。然后,
matched[0]
包含匹配的整个字符串,
matched[1]
第一个捕获组(包含捕获的内容),
matched[2]
第二个捕获组(未捕获任何内容,则包含未定义的


查看此内容以了解其工作方式。

但是为什么它返回
{d}
而不是
{a}
?因为原始字符串中没有
{a}
。这怎么可能呢?@Amadan抱歉我在
{b}
@Matthias:将你的正则表达式调整为
var regex=/(?:[^\\{}]+)|(\\[A-Za-z]+(\{[^}{]*}))|(?:$[.]+$)/
然后您将得到
[“\a{b}”、“\a{b}”、“{b}”]
它的意思与文档中所说的意思相同。读一读,你的许多逃避都是不需要的,或者说是不存在的。