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的一部分。
感谢。
答案 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,它会显示正则表达式的分组(将鼠标悬停在蓝色高亮显示的文本上)。