2014-11-03 9 views
1

Мне нужно проверить, если данная строка содержит строку или регулярное выражение. Если это так, оно должно возвращать true, в противном случае - false. Как мне это сделать?Строка содержит другую строку или регулярное выражение (Ruby)

у меня есть:

def method(string) 
    if @text.match(/#{string}/) 
    true 
    else 
    false 
    end 
end 

Но я не уверен, если это правильный путь.

+2

Stack Overflow не сайт «напишите код для меня». Вместо этого мы помогаем вам исправлять проблемы с кодом, который вы написали. Пожалуйста, покажите нам, что вы пробовали, объясните, почему он не делает то, что вы хотите, и мы с радостью вам поможем. –

+0

Вы можете легко найти свой ответ в [ruby-doc] (http://www.ruby-doc.org/core-2.1.4/String.html) –

+0

Я обновил свой пост. – user3014317

ответ

4

Рассмотрим это:

@text = 'foobar' 

def method1(string) 
    if @text.match(/#{string}/) 
    true 
    else 
    false 
    end 
end 

Это может быть уменьшено до:

def method2(string_or_regex) 
    if @text[string_or_regex] 
    true 
    else 
    false 
    end 
end 

метод струны [] позволяет передать строку или шаблон. Если это строка, метод использует ее для поиска с фиксированной строкой/строкой. Если шаблон передан, он возвращает соответствующий текст.

Однако Ruby более дружелюбный, чем этот. Нам не нужно говорить об этом, чтобы вернуть истинное или ложное значение условно. В Ruby значение nil или false считается ложным, а все остальное - «truethy». Мы можем преобразовать значение истина/ложь с помощью !!, который является двойной логическое «не»:

true # => true 
'foo' # => "foo" 
false # => false 
nil # => nil 

!true # => false 
!'foo' # => false 
!false # => true 
!nil # => true 

!!true # => true 
!!'foo' # => true 
!!false # => false 
!!nil # => false 

Зная, что и струны [] возвращает ноль, если не найден, или текст соответствия, если найдено:

'foo'['foo'] # => "foo" 
'foo'['bar'] # => nil 

мы можем уменьшить оригинальный способ:

def method3(string_or_regex) 
    [email protected][string_or_regex] 
end 

Вот что происходит тестирование каждого из указанных выше способов:

method1('foo') # => true 
method1('baz') # => false 

method2('foo') # => true 
method2(/foo/) # => true 
method2('baz') # => false 
method2(/baz/) # => false 

method3('foo') # => true 
method3(/foo/) # => true 
method3('baz') # => false 
method3(/baz/) # => false 

Вы должны быть осторожным интерполированием объекта регулярного выражения в другое регулярное выражение:

string = /foo/ 
/#{string/ # => /(?-mix:foo)/ 

(?-mix: являются модели флагов быть вставлен в другом шаблоне, который может открыть свой шаблон для всех видов странно поведения и очень сложно найти ошибки. Вместо этого, я настоятельно рекомендую использовать source метод, если вы собираетесь сделать это, что приводит к оригинальным узором вставляется:

/#{string.source}/ # => /foo/