Регулярное выражение для исключения определенного числа

4

У меня есть модель под названием 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 и регулярный выражение.
  • У меня также есть сотрудники в моем приложении, каждый из которых имеет идентификатор отдела. Чтобы определить отдел сотрудников, я использую область matching_departments в модели отдела (см. Выше).
  • У каждого сотрудника есть и идентификатор.
  • Все сотрудники, имеющие числовой идентификатор и длину идентификатора = 9, за исключением 9 нулей (000000000), должны отображаться в отдел 1.

Итак, каково должно быть регулярное выражение для department-1 в моей таблице departments? Я обновил его с помощью (^[0-9]{9,}$) - сопоставляя все числовые идентификаторы с length 9. Как я могу исключить 9 zeros?

  • 1
    Итак, вы запрашиваете шаблон MySQL REGEXP? Кажется, он не поддерживает какие-либо обходные пути. Вы можете использовать WHERE col REGEXP '^[0-9]{9}$ AND col <> '000000000'
  • 0
    Вы хотите сохранить ^[0-9]{9}$ AND col <> 000000000 в базе данных? или изменить запрос следующим образом. Я не понял тебя. В моем случае col - это динамическое значение. Это один из аргументов в моей области. Это будет варьироваться при каждом вызове. Поэтому я не думаю, что это сработает для меня.

1 ответ

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].

Надеюсь, это сработает для вас.

Привет

Edit: Возможно даже, что группы, не содержащие захват, не поддерживаются, поэтому замените их на обычную группу захвата:

^([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])$

Ещё вопросы

Сообщество Overcoder
Наверх
Меню