为什么这个RegEx匹配两个字符串?

时间:2010-11-02 10:24:19

标签: javascript regex

var str = "abcd1234";
var first = str.match(/^abcd(\d+)$/)[0]; //matches abcd1234
var number = str.match(/^abcd(\d+)$/)[1]; //matches 1234 only

为什么这个正则表达式首先匹配整个str然后匹配数字部分?看着它我会说它总是必须匹配abcd然后匹配1位或更多位数? “abcd”不是比赛的强制性部分吗?

顺便说一下,我发现这个正则表达式是this question的一部分。

感谢。

4 个答案:

答案 0 :(得分:6)

这是因为0表示整个匹配,而1表示第一个括号组(实际上是1234)

你可以这样做:

var str = "abcd1234";
var first = str.match(/^(abcd)(\d+)$/)[0]; //returns abcd1234
var chars = str.match(/^(abcd)(\d+)$/)[1]; //returns abcd only
var number = str.match(/^(abcd)(\d+)$/)[2]; //returns 1234 only

答案 1 :(得分:2)

正则表达式[0]的正则表达式匹配结果是正常的。然后[1] ...等。包含部分匹配。如果你想要匹配的第一和第二部分,你需要写一些像:

  var m = str.match(/^(abcd)(\d+)$/);
  var wholematch = m[0];
  var first = m[1];
  var num = m[2];

答案 2 :(得分:0)

https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/RegExp

捕获括号存储来自正则表达式部分的匹配,并将其与第一个结果分开,这是整个匹配。

答案 3 :(得分:0)

括号'()'中正则表达式的任何部分都成为分组。当您匹配正则表达式时,也会返回此部分匹配。如果您想匹配模式然后使用它的不同部分进行处理(例如,键“值:值”的列表,您可以为键和值创建一个组),这将非常有用。 / p>

您可以在第一个括号后面放置“?:”进行分组非捕获。以下内容将匹配您的正则表达式而不捕获分组/括号部分:

var first = str.match(/^abcd(?:\d+)$/)[0]; //returns abcd1234 ONLY

此外gskinner有一个很好的regex tester,它会显示正则表达式的分组(将鼠标悬停在蓝色高亮显示的文本上)。

相关问题