2016-12-17 13 views
2

Я пытаюсь написать регулярное выражение, которое берет слово и возвращает true для слов, начинающихся с гласной, и возвращает false для слов, начинающихся с согласного. Раньше я никогда не писал регулярное выражение, и я немного смущен тем, как писать выражение. Это то, что у меня есть до сих пор:Мне нужно написать регулярное выражение в Ruby, которое возвращает true/false

def starts_with_a_vowel?(word) 
    if word.match(/\A+[aeiou]/) == true 
    return true 
    else 
    return false 
    end 
end 

Редактировать: Если слово = "лодка", выражение должно возвращать значение false. Если word = "apple", выражение должно возвращать true.

+0

Должно ли последнее слово вашего первого предложения быть «согласным»? Это поможет, если вы предоставите примерную строку и покажете, для чего вы хотите, чтобы результат был для этой строки (например, строка, массив, другой?). Когда вы приводите примеры, полезно, если вы назначаете переменную для каждого входа (например, 'str =« Как теперь, коричневая корова? »). Таким образом, читатели могут ссылаться на эти переменные в комментариях и ответах без необходимости их определения. –

+0

Не регулярное выражение, но все еще ... 'str.capitalize.start_with? ('A', 'E', 'I', 'O', 'U')' –

+0

Возможно, у вас есть причина для возврата 'true' или 'false', но когда требуется логическое значение, чаще всего возвращается« правдивое »значение (ничего, кроме« nil »или« false ») или« ложное »значение (' nil' или 'false') , Например: '' cat '= ~/a /? «meow»: «woof» 'дает тот же результат, что и' !! ('cat' = ~/a /)? «meow»: «woof» и проще и чище. –

ответ

4

EDIT:

OK .. Так .. я никогда не тестировал код, который я раньше писал .. Это означало только как некоторое предложение, как использовать match с регулярным выражением, но это не сработало вообще. де сниппает теперь прикреплен к концу моего ответа FYI)

это здесь должно быть рабочими один:

def starts_with_a_vowel?(word) 
    !!word.capitalize.match(/\A+[AEIOU]/) 
end 

.., как это было упомянуто Эрик Duminil здесь ниже в комментариях, метод/функция не требуется

!!word.capitalize.match(/\A+[AEIOU]/) может быть использован непосредственно .. возвращает true или false

но есть, конечно, другие (м aybe лучше) решения тоже ..

..И вот НЕ рабочий код, который я ранее писал:

def starts_with_a_vowel?(word) 
    return word.match(/\A+[aeiou]/).length > 0 
end 

..следующие match метод возвращает nil, когда не совпадают и потому nil не имеет length метод определяется NoMethodError

+0

@ EricDulilil моя ошибка..отсутствует ваше время .. – n0rph3u5

+0

Гораздо лучше, я верну свой нижний план.Вам не нужно «возвращать», кстати, и '/ \ A /' не нуждается в '+' –

+0

Чтобы сделать его более ясным, вы можете поместить свой первый код в конце своего ответа, объяснив, почему он сделал Не работай. –

2

Вот несколько способов сделать это.

# 1

word = 'Ahoy' 
!!(word[0] =~ /[aeiou]/i) 
    #=> true 
word = 'hiya' 
!!(word[0] =~ /[aeiou]/i) 
    #=> false 

Регулярное выражение гласит: "соответствует гласного, случай индифферентно (/i)". !! преобразует значение thruthy в true и falsy значение (nil или false) в false:

!!0 = !(!0) = !(false) = true 
!!nil = !(!nil) = !(true) = false 

# 2

word = 'Ahoy' 
(word[0] =~ /[aeiou]/i) ? true : false 
    #=> true 
word = 'hiya' 
(word[0] =~ /[aeiou]/i) ? true : false 
    #=> false 
+0

Хорошо, извините, так что я имел в виду, это было слово. Просто одно слово, а не предложение. Таким образом, результат должен быть логическим. Извините за путаницу. – alexnewby

1

Вы делаете много дополнительной работы без причины. Во-первых, вам не нужно проверять равенство с true; только if *expression* делает трюк.

Но в этом случае вам не нужно if. Матч регулярных выражений уже возвращает значение, которое можно интерпретировать как логическое. =~ возвращает индекс соответствия как целое (что является «правдивым»); String#match возвращает объект MatchData (что также является правдой).Все в Ruby является правдивым, кроме false и nil, и nil - это то, что оба =~ и String#match возвращаются, если нет совпадения. Итак, все, что вам нужно сделать, - это превратить результат одного из них в соответствующее логическое значение, которое вы можете сделать с помощью !!. Например:

def starts_with_a_vowel? word 
    !!(word =~ /^[aeiou]/) 
end 

Это !! читается "не не", кстати. Оператор ! сам по себе трактует свой аргумент как Boolean и возвращает его противоположность как actual Boolean; что !(некоторого truthy значение) возвращает false (не nil), и !(некоторой falsey значение) возвращает true (а не только некоторые truthy значения). Поэтому применение ! дважды превращает любое правдивое значение в true и любое значение ложности (false или nil) в false.

1

В Ruby вам почти ничего не нужно, чтобы вернуть true или false. Для логической логики и if/case/unless операторы, truthy/falsey достаточно хороши. Кроме того, не забудьте использовать регистр без регистров (с //i). A гласный:

class String 
    def starts_with_a_vowel? 
    self =~ /\A[aeiou]/i 
    end 
end 

if "Airplane".starts_with_a_vowel? 
    puts "Indeed" 
end 
#=> "Indeed" 

Если по какой-то причине вам действительно нужно true/false:

class String 
    def starts_with_a_vowel? 
    !(self =~ /\A[aeiou]/i).nil? 
    end 
end 
+0

Почему вы используете '^' здесь? Поскольку мы имеем дело со строками, это не '\ A' - путь? –

+0

Вы правы. ' "Самолет \ nAirplane" .starts_with_a_vowel? # => 6'. Спасибо –

+0

Я думал, что они эквивалентны, когда не используется модификатор '// m'. Но многострочный модификатор, по-видимому, влияет на '.', а не'^'или' $ ' –

1

У вас есть использовать регулярное выражение? Просто спрашиваю потому что Руби уже обеспечивает String#start_with?

vowels = %w(a e i o u) 
"boat".start_with?(*vowels) 
# => false 
"apple".start_with?(*vowels) 
#=> true 
+1

' '' '' также является гласным. –

+0

Да. Хотя, если вы посмотрите на исходный пост, вы заметите, что в регулярном выражении указаны только строчные гласные. Если OP должно соответствовать обоим случаям, они могут либо добавить заглавные гласные к массиву 'vowels', либо' downcase' строку перед вызовом 'start_with?'. –

0

word.match? /\A[aeiou]/i буквально все, что вам нужно. (Рубин> = 2,4)

Это соответствует началу строки \A с последующим гласным [aeiou] в регистронезависимом образом i возвращающая логическое значение word.match?

Перед рубин 2.4 вы должны использовать word.match и преобразовать его в bool, что проще всего сделать путем логического его сбрасывания дважды с !!