我正在使用 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 位)连字符分隔。
什么是正则表达式?
我正在使用 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 位)连字符分隔。
什么是正则表达式?
Tudor Constantin 的回答可以简化:
/^(?!-)(?:(?:^|-)\d{1,3}){6}$/
编辑以删除进一步的重复。
再次编辑以禁止前导连字符。此编辑需要前瞻,某些引擎不支持。但是,它确实只使用了固定宽度的前瞻,从而最大限度地提高了与支持前瞻的引擎的兼容性。
解释最新的模式:
^
指定字符串(或行)的开头。
(?!-)
利用前瞻来禁止匹配第一个字符是连字符的字符串。
(?:(?:^|-)\d{1-3}){6}
指定模式的重复,该模式必须是字符串或连字符的开头,后跟一到三个数字,重复六次。
$
确保字符串(或行)在之前的重复之后结束。
并不是说前瞻在技术上存在任何问题,但我认为为了直观起见,我会将 Tudor Constantin 的建议缩短为:
/^\d{1,3}(?:-\d{1,3}){5}$/
尝试:
/^\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}/
不得不添加直观的负面预测。如果我是你,我会坚持重复的版本——未来你会感谢你的。