【问题标题】:Regular expression to exclude a particular number排除特定数字的正则表达式
【发布时间】:2016-07-03 14:38:50
【问题描述】:

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

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

【问题讨论】:

  • 那么,您需要 MySQL REGEXP 模式吗?它似乎不支持任何环视。你可以使用WHERE col REGEXP '^[0-9]{9}$ AND col &lt;&gt; '000000000'
  • 您是说要在数据库中保存^[0-9]{9}$ AND col &lt;&gt; 000000000 吗?或像这样更改查询。我没有得到你。在我的情况下 col 是一个动态值。这是我范围的一个论据。每次调用范围都会有所不同。所以我不认为这对我有用。

标签: mysql ruby-on-rails ruby regex


【解决方案1】:

它并不漂亮,但即使是最简单的正则表达式风格也应该适用。进行 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])$

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-20
    • 2018-10-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多