昇順または降順で連続した一連の数字のみで構成されるデータをチェックする方法として、次の正規表現を思い付きました。
明らかな制約: 文字列の長さは 2 ~ 10 桁です。これは、1 桁はシーケンスではなく、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
それをより引き締めたり、より美しくしたりしたいですか?