0

我正在使用 Ruby on Rails,并且我“是新手”/“不记得如何”匹配正则表达式。我想validates_format_of用正则表达式匹配以下字符串:

122-162-281-5-0-221
122-162-281-05-00-221
122-162-281-005-000-221

注意:正则表达式应匹配一组6 个数字(每个数字最小 1 位,最大 3 位)连字符分隔。

什么是正则表达式?

4

3 回答 3

2

Tudor Constantin 的回答可以简化:

/^(?!-)(?:(?:^|-)\d{1,3}){6}$/

编辑以删除进一步的重复。

再次编辑以禁止前导连字符。此编辑需要前瞻,某些引擎不支持。但是,它确实只使用了固定宽度的前瞻,从而最大限度地提高了与支持前瞻的引擎的兼容性。

解释最新的模式:

^指定字符串(或行)的开头。

(?!-)利用前瞻来禁止匹配第一个字符是连字符的字符串。

(?:(?:^|-)\d{1-3}){6}指定模式的重复,该模式必须是字符串或连字符的开头,后跟一到三个数字,重复六次。

$确保字符串(或行)在之前的重复之后结束。

于 2013-03-31T06:07:46.933 回答
1

并不是说前瞻在技术上存在任何问题,但我认为为了直观起见,我会将 Tudor Constantin 的建议缩短为:

/^\d{1,3}(?:-\d{1,3}){5}$/
于 2013-03-31T06:33:50.877 回答
0

尝试:

/^\d{1,3}-\d{1,3}-\d{1,3}-\d{1,3}-\d{1,3}-\d{1,3}$/

重构,不再重复:

/^(?:\d{1,3}(?:-|$)){6}/

这个想法与 eyelidlessness 的想法相同,但测试-字符串末尾是否存在

编辑删除匹配端-

/^(?:\d{1,3}(?:-(?!$)|$)){6}/

不得不添加直观的负面预测。如果我是你,我会坚持重复的版本——未来你会感谢你的。

于 2013-03-31T06:03:38.423 回答