正则表达式:匹配x次或者y次

时间:2009-05-15 00:29:47

标签: regex

假设我需要匹配一个模式,如果它连续出现3或6次。我能得到的最接近的是\ d {3,6},但这并不是我所需要的。

'123'应匹配
'123456'应匹配
'1234'不匹配

4 个答案:

答案 0 :(得分:31)

^(\d{3}|\d{6})$

你必须有某种终结者,否则\d{3}将匹配1234.这就是为什么我把^和$放在上面。另一种方法是使用外观:

(?<!\d)(\d{3}|\d{6})(?!\d)

确保它之前没有数字(在这种情况下)。更多信息Lookahead and Lookbehind Zero-Width Assertions

答案 1 :(得分:11)

怎么样:

(\d\d\d){1,2}

虽然你需要两端的防护装置,这取决于你的RE引擎,例如:

[^\d](\d\d\d){1,2}[^\d]

或:

^(\d\d\d){1,2}$

答案 2 :(得分:1)

第一个匹配3,6,但也有9个,12个,15个......第二个看起来正确。这是另一个转折:

\d{3}\d{3}?

答案 3 :(得分:0)

在这种情况下,我们可以摆脱这种狡猾的方法:

清洁实施

/(\d{3}){1,2}/
/(?:\d{3}){1,2}/

如何?!

之所以可行,是因为在这种情况下,我们正在寻找三个连续的倍数。

注意:在这种情况下没有理由捕获该组,因此我将?:非捕获组标志添加到捕获组。

这类似于paxdiablo的实现,但更加简洁。

匹配十六进制

我正在做一些基本的十六进制颜色匹配操作,因为它们的长度可以是3或6。这使我可以保持十六进制颜色检查器匹配的DRY状态,即:

/^0x(?:[\da-f]{3}){1,2}$/i