我应该制作一个正则表达式来匹配在一个字符串中出现三次的数字,每个数字用空格分隔。但我不知道.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的结果是一样的。现在我更加困惑。答案 0 :(得分:4)
JavaScript正则表达式对象没有 (Casimir et Hippolyte在问题中为您更改了它) match
方法。您可能会想到字符串上的那个:
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");