我想出了以下正则表达式来检查仅由一组按升序或降序排列的连续数字组成的数据。
明显的限制:字符串的长度在 2 到 10 位之间,因为一位不是序列,并且必须重复超过十位。其他代码将确保输入仅包含数字。(例如 /\A\d{2,}\z/
)
例子:
'012'
,'9876'
并且'56'
应该匹配'7'
,'013'
,'6554'
不'09'
应该
我认为这可以完成工作:
/(?:\A(?:0(?=1)|1(?=2)|2(?=3)|3(?=4)|4(?=5)|5(?=6)|6(?=7)|7(?=8)|8(?=9)|\d(?!\d)){2,}\z)|
(?:\A(?:1(?=0)|2(?=1)|3(?=2)|4(?=3)|5(?=4)|6(?=5)|7(?=6)|8(?=7)|9(?=8)|\d(?!\d)){2,}\z)/x
问题来了:你能找到一种更简洁或更漂亮的方式来用兼容 Ruby 的正则表达式来表达它吗?
显然,几个嵌套循环将是同一问题的非正则表达式解决方案。
if num.length > 1
[Proc.new { |n| n + 1 }, Proc.new { |n| n - 1 }].each do |p|
is_sequential = true
(0..num.length - 2).each do |i|
if p.call(num[i].ord) != num[i + 1].ord
is_sequential = false
break
end
end
return 'Number is sequential' if is_sequential
end
end
想让它更紧或更漂亮吗?