我正在尝试将比利时增值税号格式设为BE0.###.###.###
。最后9位数字可以输入前缀BE
,BE0
或完全没有任何内容..我正在使用以下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,我需要的数字索引不会改变。
答案 0 :(得分:1)
当你使用.match()
和没有全局g
标志的正则表达式时,结果数组的第一个元素是整个正则表达式匹配的字符串,然后是数组元素是匹配的子组。也就是说,您描述的行为是正常和正确的。
在你的情况下,返回的第一个元素是整个输入,因为那是你的正则表达式匹配的。
代码中.match()
的第二次使用使用 具有g
标记的正则表达式(并且没有任何子组),以便& #39;为什么它表现不同。
(请注意,无论有没有g
标志,如果根本没有匹配,您将获得null
,而不是空数组。)