假设我需要匹配一个模式,如果它连续出现3或6次。我能得到的最接近的是\ d {3,6},但这并不是我所需要的。
'123'应匹配
'123456'应匹配
'1234'不匹配
答案 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