gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 12:10:16 25 4
gpt4 key购买 nike

我正在尝试将比利时增值税号格式化为 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(" ");

它不执行此操作。这也没什么大不了的,因为我可以简单地将我必须获得的索引增加 1。

<小时/>

考虑完我接受的答案后,我更改了代码以使用:

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,我需要的数字的索引不会改变。

最佳答案

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

在您的情况下,返回的第一个元素是整个输入,因为这就是您的正则表达式匹配的内容。

在代码中第二次使用 .match() 使用的正则表达式确实具有 g 标志(并且没有任何子组),这就是它的行为不同的原因。

(请注意,无论有没有 g 标志,如果根本没有匹配项,您都会返回 null,而不是空数组。)

关于javascript - 为什么这个 javascript regex.match 捕获了 3 个组,而我只期望 2 个组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24996467/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com