.match和捕获组如何协同工作?

时间:2017-06-11 15:54:58

标签: javascript regex

我应该制作一个正则表达式来匹配在一个字符串中出现三次的数字,每个数字用空格分隔。但我不知道.match()方法和捕获小组是如何工作的。

所以我有以下内容:

let repeatNum = "42 42 42";
let reRegex = /(\d+)\s\1/; // Change this line
let result = repeatNum.match(reRegex);
console.log(result);

结果是:

["42 42", "42"]

好的,我有点理解为什么这个数组的第一个元素是“42 42”。

正则表达式:

/(\d+)\s\1/

表示识别一个或多个数字和空格。你把这个词放在组#1中,然后在那个空格后找到另一个单词,就像组#1那样。

我已经看到这个正则表达式如何在一个双字的例子中起作用。但是我不知道它对三个或更多相同数字的效果如何?

编辑:我刚刚发现42 42 42 42的结果是一样的。现在我更加困惑。

1 个答案:

答案 0 :(得分:4)

JavaScript正则表达式对象没有match方法。您可能会想到字符串上的那个 (Casimir et Hippolyte在问题中为您更改了它)



let repeatNum = "42 42 42";
let reRegex = /(\d+)\s\1/; // Change this line
let result = repeatNum.match(reRegex);
console.log(result);




String#match返回一个数组,其中包含整体匹配作为第一个条目,后跟任何捕获组的内容作为数组中的后续条目。这就是您获得["42 42", "42"]的原因:"42 42"是表达式的总体匹配,而"42"是第一个捕获组的内容。

如果您只想要整体匹配,只需使用数组中的第一个条目。

  

我应该制作一个正则表达式来匹配在一个字符串中出现三次的数字,每个数字用空格分隔。

你的正则表达不会那样做。它会尝试在字符串中匹配相同数字两次

如果您希望三次匹配相同号码,则只需要另一个\s\1



let repeatNum = "42 42 42";
let reRegex = /(\d+)\s\1\s\1/;
let result = repeatNum.match(reRegex);
console.log(result ? result[0] : "No match");




如果您只想匹配以空格分隔的数字,最简单的方法就是使用\d+\s\d+\s\d+



let repeatNum = "42 43 44";
let reRegex = /\d+\s\d+\s\d+/;
let result = repeatNum.match(reRegex);
console.log(result ? result[0] : "No match");




...虽然你可以使用\d+(?:\s\d+){2},如果你喜欢,它会说"一系列数字后跟两个实例:一个空格后跟一系列数字。"



let repeatNum = "42 43 44";
let reRegex = /\d+(?:\s\d+){2}/;
let result = repeatNum.match(reRegex);
console.log(result ? result[0] : "No match");




  

我刚刚发现结果与42 42 42 42相同

没有锚点,正则表达式将在字符串中找到匹配项;它并不要求匹配匹配整个字符串。因此,当您针对"42 42 42 42"运行上述任何一项时,您会看到与在"42 42 42"上使用它时相同的事情,因为它与子字符串匹配。

如果您只想匹配 整个内容,请在开头添加^,在结尾添加$。这些是输入断言的开始/结束。

例如,上面的第一个更改(正则表达式的最小更改):



let repeatNum = "42 42 42";
let reRegex = /^(\d+)\s\1\s\1$/;
let result = repeatNum.match(reRegex);
console.log("repeatNum:", result ? result[0] : "No match");
let repeatNum2 = "42 42 42 42";
result = repeatNum2.match(reRegex);
console.log("repeatNum2:", result ? result[0] : "No match");