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

33
假设我需要匹配一个模式,当它连续出现3次或6次时需要进行匹配。最接近的方法是使用类似于\d{3,6}的表达式,但这并不能完全满足我的需求。
'123'应该匹配 '123456'应该匹配 '1234'不应该匹配

要匹配X或Y或Z或...次,请参见更实用和易读(虽然不是纯正则表达式)的解决方案,网址为https://stackoverflow.com/a/37351977/6047827。 - Micah Lindstrom
4个回答

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

你必须要有一种终止符,否则 \d{3} 将匹配 1234。这就是我在上面加入 ^ 和 $ 的原因。另一种选择是使用正向否定查找:

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

为确保它不被数字(在这种情况下)前缀或后缀,请使用先行断言和后发断言。更多信息请参见先行断言和后发断言的零宽度断言


这看起来不错,谢谢。但如果模式比仅为\d要大得多怎么办?我猜我可以在构建正则表达式时做一些字符串插值,但是否有更好的重用子模式的方法? - vwoo
在这种情况下,您将想要使用{1,2}格式,即((<baseRegex>){3}){1,2}。 - Alan Moore

17

试试这个:

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

尽管您还需要在正则表达式引擎两端设置保护符,例如:

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

或:

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

5

对于这个案例,我们可以使用这种巧妙的方法:

清晰易懂的实现

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

怎么做?!

这是因为我们在寻找连续的三的倍数。

注意:对于此情况,没有必要捕获组,因此我将?:非捕获组标志添加到捕获组中。

这类似于paxdiablo的实现,但略微更清晰。

匹配十六进制

我正在进行类似的操作来匹配基本的十六进制颜色,因为它们可以是3或6位长度。这使我能够保持我的十六进制颜色检查器的匹配DRY。

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

0

第一个匹配3、6,但也匹配9、12、15等。第二个看起来正确。再来一个变化:

\d{3}\d{3}?

12
第一和第二是什么?如果你在引用别人的答案,你应该说明是哪一个。这些答案并不总是以相同的顺序出现。 - Alan Moore

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接