为什么这个javascript regex.match捕获3组我只期望2?

时间:2014-07-28 13:33:40

标签: javascript regex

我正在尝试将比利时增值税号格式设为BE0.###.###.###。最后9位数字可以输入前缀BEBE0或完全没有任何内容..我正在使用以下javascript编号:

function BEVATFormat(vatnumber) {
    var numbers = vatnumber.match(/^(BE)?(0?\d{9})$/)[1];
    var letters = "BE0";
    if (numbers.length == 10) {
        numbers = numbers.slice(1);
    }
    numbers = numbers.match(/\d{1,3}/g).join(".");
    return letters + "." + numbers;
}

我预计这只会返回2场比赛,因为我只有2个比赛组。但是,我发现有3组:首先是整个输入,然后是BE,然后是数字。这是为什么?

我应该澄清为什么我不期待这个结果。当我尝试通过分组4个字符来格式化IBAN号码时,我使用:

ibanNumber.match(/.{1,4}/g).join(" ");

不这样做。这也不是什么大不了的事,因为我可以简单地增加我必须得到的索引。


在考虑了我接受的答案后,我改变了我的代码:

function BEVATFormat(vatnumber) {
    var numbers = vatnumber.match(/0?(\d{9})$/)[1];
    var letters = "BE 0";
    numbers = numbers.match(/\d{1,3}/g).join(".");
    return letters + numbers;
}

因为我需要的所有号码都是最后9位数。这样,如果那里没有BE或0,我需要的数字索引不会改变。

1 个答案:

答案 0 :(得分:1)

当你使用.match()和没有全局g标志的正则表达式时,结果数组的第一个元素是整个正则表达式匹配的字符串,然后是数组元素是匹配的子组。也就是说,您描述的行为是正常和正确的。

在你的情况下,返回的第一个元素是整个输入,因为那是你的正则表达式匹配的。

代码中.match()的第二次使用使用 具有g标记的正则表达式(并且没有任何子组),以便& #39;为什么它表现不同。

(请注意,无论有没有g标志,如果根本没有匹配,您将获得null,而不是空数组。)