我想出了以下正则表达式来检查仅由一组按升序或降序排列的连续数字组成的数据。
明显的限制:字符串的长度在 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
想让它更紧或更漂亮吗?
最佳答案
def isseq( s )
1 < s.length && !!( '0123456789'[s] || '9876543210'[s] )
end
[ '012', '9876', '56', '7', '013', '6554', '09' ].each do |test|
puts "#{test} #{isseq(test)}"
end
输出:
012 true
9876 true
56 true
7 false
013 false
6554 false
09 false
super_string 的想法归功于 tihom,使用 str[s] 归功于 Tin Man。
关于ruby - 用于检测数字序列的正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19550470/