ruby - 用于检测数字序列的正则表达式

标签 ruby regex

我想出了以下正则表达式来检查仅由一组按升序或降序排列的连续数字组成的数据。

明显的限制:字符串的长度在 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/

相关文章:

ruby-on-rails - 如何使用 Capistrano gem 为生产数据库播种?

python - RegEx - 如何仅获取在大输出中重复的多行文本 block ?

python - 检索不包含空格的小数

ruby-on-rails - 如何猴子修补 Rails 附带的 rake 任务?

ruby - Ruby 语言中的 _|_ 是什么?

python - Ruby/Python 中的 POST 请求返回 'No Data'

C++ boost 正则表达式日期错误

ruby-on-rails - 在同一服务器上的 2 个 Rails 应用程序之间交换数据(最好是离线)

python - 如何创建美元货币的正则表达式?

正则表达式从行尾找到第四个逗号