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

时间:2016-11-30 21:50:03

标签: php regex quantifiers

我尝试为荷兰牌照(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

然而,这不会匹配,而

  

([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 Demo代码段

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}`);
    });
}

1 个答案:

答案 0 :(得分:4)

这是因为最后添加的{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个字符,您可以调整它符合您的需求。