返回的exec()数组的含义是什么

时间:2015-04-11 08:44:53

标签: 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}', undefined, undefined];

单个条目是什么意思?以及如何控制它们?

提前致谢!

4 个答案:

答案 0 :(得分:1)

这就是RegExp.prototype.exec的工作方式。

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

答案 1 :(得分:1)

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}"]

答案 2 :(得分:1)

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

/(c)|(b(.))./.exec('abcdef')应该返回['bcd', undefined, 'bc', 'c']。该模式是(c)(b(.)).之间的交替; "bcd""c"之前出现,所以第二种选择匹配而第一种选择不匹配。因此,第一个捕获组(c)undefined,因为它没有任何匹配。第二个捕获组(b(.))"bc"匹配。第三个是(.),匹配"c"

答案 3 :(得分:1)

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

var text = 'azrt12345';
var regex = /([a-z]+)|([0-9]+)/;
var matched = regex.exec(text);
/* matched = ["azrt", "azrt", undefined] */

如您所见,正则表达式捕获字符串数字字符串。由于text以字母字符开头,因此第一个捕获组工作,而不是第二个捕获组。然后,matched[0]包含匹配的整个字符串,matched[1]第一个捕获组(捕获的内容),matched[2]第二个捕获组(没有捕获任何内容,然后包含undefined )。

请参阅此excellent doc以了解其工作方式。