例如,一个人有简单的正则表达式:
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];
单个条目是什么意思?以及如何控制它们?
提前致谢!
答案 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以了解其工作方式。