Ruby: Какой правильный синтаксис для метода логического регулярного выражения? - PullRequest
17 голосов
/ 07 февраля 2010

Каков правильный синтаксис для метода, который проверяет строку для шаблона и возвращает true или false, если регулярное выражение совпадает?

Основная идея:

def has_regex?(string)
    pattern = /something/i
    return string =~ pattern
end

Вариант использования:

if has_regex?("something")
    # woohoo
else
    # nothing found: panic!
end

Ответы [ 9 ]

43 голосов
/ 15 января 2014

В вопросе, который вы сказали:

... метод, который проверяет строку для шаблона и возвращает true или false, если регулярное выражение соответствует

Как указано johannes String=~ возвращает nil, если шаблон не совпадает, и позиция в строке, где совпадающее слово выглядело иначе. Далее в Ruby говорится, что все, кроме nil и false , ведут себя как true. Все это правильно.

Однако они не являются точно true или false. Следовательно, последний шаг заключается в приведении значения к Boolean. Это достигается за счет переноса результата в двойные удары и возвращает true.

def has_regex?(string)
    !!(string =~ /something/i)
end
15 голосов
/ 07 февраля 2010

Ваш код выглядит хорошо, но вы могли бы написать его еще меньше.

Возвращаемое значение String#=~ ведет себя так:

  • nil если шаблон не соответствует
  • позиция в строке, где началось совпадение слова

В Ruby все, кроме nil и false ведет себя как true в условном выражении, поэтому вы можете просто написать

if string=~ pattern
  # do something
else
  # panic
end
11 голосов
/ 24 октября 2014

Чтобы вернуть true / false, переключите положение шаблона и строки и используйте равенство регистра ===

def has_regex?(string)
    pattern = /something/i
    return pattern === string
end

Мне абсолютно необходимо было вернуть истинное логическое значение и покопаться. Фактически это задокументировано в классе регулярных выражений http://www.ruby -doc.org / core-2.1.3 / Regexp.html # method-i-3D-3D-3D

5 голосов
/ 25 января 2018

Для Ruby> = 2.4 или Rails вы можете сделать:

 regexp.match?(string)
5 голосов
/ 14 июля 2017

Если вы используете Ruby 2.4 или более позднюю версию, существуют методы String#match?(regex) и Regexp#match?(string), которые возвращают логические значения без преобразований (где это необходимо, обычно нет) и имеют улучшенную производительность для загрузки.

https://ruby -doc.org / ядро-2.4.0 / Regexp.html # метод-я-матч-3F

https://blog.cognitohq.com/new-features-in-ruby-2-4/

2 голосов
/ 22 мая 2014

Добавление этого в класс String делает его довольно простым в использовании:

   class String
      def match?(regex)
          !!self.match(regex)
      end
   end

Я добавил его в инициализатор Rails (RAILS_ROOT / config / initializers), и вы можете вызывать его непосредственно из строки:

"Something special!".match?(/something/i) #=> true 
"Somethin' special!".match?(/something/i) #=> false 
1 голос
/ 09 октября 2015

Для чьего-либо будущего упоминания о двойных ударах хмурится из рубинового руководства Ббацова . Вместо того, чтобы использовать двойной удар, просто проверьте, не является ли значение ноль. Если значение не ноль, оно существует.

Вместо этого:

def has_regex?(string)
  !!(string =~ /something/i)
end

Вы всегда можете сделать это:

def has_regex?(string)
  !(string =~ /something/i).nil?
end
0 голосов
/ 17 марта 2016

Поскольку я хотел, чтобы это работало в целом, а не только для какого-либо конкретного проекта, я вообще не хочу изменять среду.

Мне удалось заставить его работать, просто используя возвращаемое значение из обычного match метода в качестве условия. Протестировал как положительный, так и отрицательный регистр на примере строки:

irb(main):014:0> if "123".match(/.2./); puts "worked"; end
worked
=> nil
irb(main):015:0> if "123".match(/.3./); puts "worked"; end
=> nil
0 голосов
/ 08 февраля 2010

Если вы хотите поместить шаблон в метод, вы можете просто сделать

def has_my_pattern(st)
    st =~ /pattern/
end

Или, может быть, лучше вместо этого поместить шаблон в переменную класса?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...