正则表达式以排除特定数字

时间:2016-03-17 10:07:20

标签: mysql ruby-on-rails ruby regex

我有一个名为Department的模型。

    class Department < ActiveRecord::Base  
      # Associations
      belongs_to :client
      belongs_to :facility

      scope :facility_departments, ->(facility_id) { 
                                  where("facility_id = ? ", facility_id)}

      scope :matching_departments, ->(facility_id, identifier) {facility_departments(facility_id).where("
 ? REGEXP reg_exp ", identifier.to_s).order("weight DESC") }

    end
  • 在departments表中,我有一个facility_id和一个正则表达式列。
  • 我的应用程序中也有员工,每个人都有一个部门ID。为了识别员工部门,我在部门模型中使用范围matching_departments(见上文)。
  • 每个员工也都有一个标识符。
  • 所有员工的数字标识符和标识符长度= 9,除了9个零(000000000) - 应该映射到部门1.

那么department-1表中departments的正则表达式应该是什么? 我使用(^[0-9]{9,}$)更新了它 - 将所有数字标识符与length 9匹配。如何排除9 zeros

1 个答案:

答案 0 :(得分:0)

它不是很漂亮,但应该使用最简单的正则表达式。进行9次单独测试,检查每个位置的非0位数:

^(?:[1-9]\d{8}|\d[1-9]\d{7}|\d{2}[1-9]\d{6}|\d{3}[1-9]\d{5}|\d{4}[1-9]\d{4}|\d{5}[1-9]\d{3}|\d{6}[1-9]\d{2}|\d{7}[1-9]\d|\d{8}[1-9])$

首先在第一个位置测试1-9,然后是8位数。接下来是数字,然后是1-9,接着是7位数字。等等...

如果您的正则表达式不支持数字字符类,请将\d替换为[0-9]

希望这适合你。

此致

修改 甚至可能不支持非捕获组,因此将其替换为普通捕获组:

^([1-9][0-9]{8}|[0-9][1-9][0-9]{7}|[0-9]{2}[1-9][0-9]{6}|[0-9]{3}[1-9][0-9]{5}|[0-9]{4}[1-9][0-9]{4}|[0-9]{5}[1-9][0-9]{3}|[0-9]{6}[1-9][0-9]{2}|[0-9]{7}[1-9][0-9]|[0-9]{8}[1-9])$