假设我需要匹配一个模式,当它连续出现3次或6次时需要进行匹配。最接近的方法是使用类似于\d{3,6}的表达式,但这并不能完全满足我的需求。
'123'应该匹配 '123456'应该匹配 '1234'不应该匹配
'123'应该匹配 '123456'应该匹配 '1234'不应该匹配
^(\d{3}|\d{6})$
你必须要有一种终止符,否则 \d{3}
将匹配 1234。这就是我在上面加入 ^ 和 $ 的原因。另一种选择是使用正向否定查找:
(?<!\d)(\d{3}|\d{6})(?!\d)
为确保它不被数字(在这种情况下)前缀或后缀,请使用先行断言和后发断言。更多信息请参见先行断言和后发断言的零宽度断言。
试试这个:
(\d\d\d){1,2}
尽管您还需要在正则表达式引擎两端设置保护符,例如:
[^\d](\d\d\d){1,2}[^\d]
或:
^(\d\d\d){1,2}$
对于这个案例,我们可以使用这种巧妙的方法:
/(\d{3}){1,2}/
/(?:\d{3}){1,2}/
这是因为我们在寻找连续的三的倍数。
注意:对于此情况,没有必要捕获组,因此我将?:
非捕获组标志添加到捕获组中。
这类似于paxdiablo
的实现,但略微更清晰。
我正在进行类似的操作来匹配基本的十六进制颜色,因为它们可以是3或6位长度。这使我能够保持我的十六进制颜色检查器的匹配DRY。
/^0x(?:[\da-f]{3}){1,2}$/i
第一个匹配3、6,但也匹配9、12、15等。第二个看起来正确。再来一个变化:
\d{3}\d{3}?
X或Y或Z或...
次,请参见更实用和易读(虽然不是纯正则表达式)的解决方案,网址为https://stackoverflow.com/a/37351977/6047827。 - Micah Lindstrom