2016-12-17 2 views
2

母音で始まる単語に対して真を返し、子音で始まる単語に対して偽を返す正規表現を作成しようとしています。前に正規表現を書いたことは一度もありません。表現を書く方法について少し混乱しています。これは今まで私が持っているものです:真/偽を返すRubyに正規表現を書く必要がある

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

編集:word = "boat"の場合、式はfalseを返すはずです。 word = "apple"の場合、expressionはtrueを返します。

+0

最初の文の最後の単語は「子音」ですか?サンプルの文字列を提供し、その文字列(たとえば、文字列、配列、その他の文字列)の結果を表示する場合に役立ちます。例を挙げると、変数を各入力に割り当てると便利です(例えば、 'str ="今、茶色の牛? ")。そうすることで、読者はコメントや回答の変数を定義することなくその変数を参照することができます。 –

+0

正規表現ではありませんが、それでも... 'str.capitalize.start_with?( 'A'、 'E'、 'I'、 'O'、 'U')' –

+0

'true'を返す必要があるかもしれません。論理値が必要なときは、 "真実"値( 'nil'や' false'以外のもの)や '偽値'( 'nil'や' false'など)を返す方が一般的です。 。例: '' cat '=〜/ a /? "meow": "woof"は '!!( 'cat' =〜/ a /)と同じ結果を返します。 "ヤノウ": "馬鹿"と、よりシンプルでクリーンです。 –

答えて

4

EDIT:

OK .. ..だから私は、私が以前に書いたコードをテストしたことはありません..それは正規表現でmatchをどのように使うべきかということだけを意図していましたが、まったく機能しませんでした。デ・スニペット今FYI私の答えの端部に取り付けられている)

このここで働くものでなければならない。それはコメントで下にここエリックDuminilで言及されたか..but

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

、方法/関数は

!!word.capitalize.match(/\A+[AEIOU]/)を直接使用することができる必要はない.. ではtrue又はfalse

を返すが、他の(Mは確かに存在します

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

と一致しないとき..the match方法はnilを返し、nilは何lengthメソッドを持っていないので:aybe良い)ソリューションすぎ..ここ

..andは、私が以前に書いた動作していないコードであり、定義すると、それは発生するNoMethodError

+0

@ EricDuminilあなたの時間のために私の欠陥..ありがとうございました。 – n0rph3u5

+0

もっと良い、私は私のdownvoteを元に戻すでしょう。あなたは途中で 'return'を必要とせず、'/\ A/'は' + 'を必要としません。 –

+0

明確にするために、答えの最後に最初のコードを置き、仕事はありません。 –

2

これを行うには、いくつかの方法があります。

#1

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

正規表現は、 "母音、ケース無関心(/i)と一致"、読み出します。 !!falsetrueにthruthy値とfalsy値(nilまたは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オブジェクト(真実でもあります)を返します。ルビーのすべてfalsenil以外は真実です。nilは一致するものがなければ=~String#matchの両方となります。だからあなたがしなければならないのは、それらの結果を対応するブール値に変換することです。これは!!で行うことができます。たとえば:

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

その!!は「いや」ではありません。 !演算子は、その引数をブール値として扱い、その逆をという実際のブール値として返します。すなわち!(一部truthy値)戻るfalsenilない)、及び!(一部falsey値)true戻る(だけでなく、いくつかのtruthy値)です。したがって、!を2回適用すると真理値はtrueになり、偽りの値(falseまたはnil)はfalseになります。

1

Rubyでは、trueまたはfalseを返すために何も必要はほとんどありません。ブール論理とステートメントの場合は、truthy/falseyで十分です。また、大文字と小文字を区別しないRegex(//i)を使用することを忘れないでください。何らかの理由であなたが本当にtrue/falseが必要な場合は

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

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

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

なぜ '^'を使うのですか?私たちは文字列を扱っているので、 '\ A'は行く方法ではありませんか? –

+0

あなたは正しいです。 「飛行機\ n飛行機」.starts_with_a_vowel? #=> 6 '。ありがとう –

+0

'// m'修飾子を使用していない場合、それらは同等であると思いました。しかし、複数行の修飾子は '^'や '$'ではなく '.'にのみ影響するようです。 –

1

あなたは正規表現を使用するを持ってくださいAは母音のですか?ただ、RubyはすでにString#start_with?

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

' 'A ''も母音です。 –

+0

はい。元の投稿を見ると、正規表現は小文字の母音しか指定していないことに気づくでしょう。 OPがどちらの場合にも一致する必要がある場合、 'vowels'配列に大文字の母音を追加するか、' start_with? 'を呼び出す前に文字列を 'downcase'することができます。 –

0

word.match? /\A[aeiou]/iを提供して原因を尋ねると、文字通りあなたが必要とするすべてです。 (ルビー> = 2.4)

それはブール値を返す大文字と小文字を区別しない方法iに母音[aeiou]に続く文字列\Aの先頭にマッチword.match?あなたはword.matchを使用し、それを変換する必要がありルビー2.4前

論理的にそれを2回論理的に否定することで最も簡単なブール!!

関連する問題