为什么我的正则表达式组量词不起作用?

Why does my regex group quantifier not work?

我尝试为荷兰牌照 (kentekens) 编写一些正则表达式,the documentation 非常清楚,我只想检查它们的格式,而不是现在是否可以使用实际的字母字符。

My regex (regex101) 看起来如下:

(([0-9]{1,2}|[a-z]{1,3})-([0-9]{2,3}|[a-z]{2,3})-([0-9]{1,2}|[a-z]{1,2})){8}/gi

然而这个returns没有匹配,而

([0-9]{1,2}|[a-z]{1,3})-([0-9]{2,3}|[a-z]{2,3})-([0-9]{1,2}|[a-z]{1,2}/gi

不过我确实也喜欢检查总长度。

JS 演示片段

const regex = /([0-9]{1,2}|[a-z]{1,3})-([0-9]{2,3}|[a-z]{2,3})-([0-9]{1,2}|[a-z]{1,2})/gi;
const str = `XX-99-99
2​ 1965​ 99-99-XX ​
3​ 1973​ 99-XX-99​
4​ 1978​ XX-99-XX ​
5​ 1991​ XX-XX-99 ​
6​ 1999​ 99-XX-XX ​
7​ 2005​ 99-XXX-9​
8​ 2009​ 9-XXX-99​
9​ 2006​ XX-999-X ​
10​ 2008​ X-999-XX ​
​11 ​2015 ​XXX-99-X`;
let m;

while ((m = regex.exec(str)) !== null) {
    // This is necessary to avoid infinite loops with zero-width matches
    if (m.index === regex.lastIndex) {
        regex.lastIndex++;
    }
    
    // The result can be accessed through the `m`-variable.
    m.forEach((match, groupIndex) => {
        console.log(`Found match, group ${groupIndex}: ${match}`);
    });
}

这是因为在末尾添加的 {8} 量词将作用于前面的表达式,在本例中是整个正则表达式,因为它被括号括起来了。 See here 匹配此正则表达式的内容。

要测试长度,请使用此正则表达式 (?=^.{1,8}$)(([0-9]{1,2}|[a-z]{1,3})-([0-9]{2,3}|[a-z]{2,3})-([0-9]{1,2}|[a-z]{1,2})) 它使用先行确保以下字符匹配 ^.{1,8}$,这意味着整个字符串应包含 1 到 8 个字符,您可以根据您的需要进行调整。