2012-11-28 31 views
0

我試圖確定一個單詞是否以元音,一個輔音,兩個輔音或三個輔音開始。這是我迄今爲止的,但我不能得到它的工作。單詞前三個字符的正則表達式

def vowel_first(word) 
    word[0] =~ /[aeiou]/ 
    end 

    def consonant_first_three(word) 
    word[0-2] =~ /^[^aeiou]{3}/ 
    end 

    def consonant_first_two(word) 
    word[0-1] =~ /[^aeiou]{2}/ 
    end 

    def consonant_first(word) 
    word[0] =~ /[^aeiou]{1}/ 
    end 
+2

你能描述什麼是行不通的嗎? – MushinNoShin

+0

我發現我的錯誤,我應該一直在檢查範圍[0..2]而不是[0-2]而不是[0-2] – Greg

回答

0

這裏的問題似乎是在比較之前對word進行了修改。在這種情況下,0-1評估爲-1,這意味着「最後一個字符」。同樣,word[0]指的是第一個字符,在索引爲零,而"foo"將評估爲"f"。您可以按原樣使用word。正則表達式被正確地錨定,並且應該提供給它匹配的東西。

請注意,使用word.match(/.../)通常比word =~ /.../更具可讀性,因爲該操作符是Perl的一種保留,這是一種從未因可讀性而被完全讚揚的語言。

+0

如果與整個單詞一起使用,則不應該認爲正則表達式需要使用「^」錨。 –

+0

是的。如果您正在進行單個字符匹配,錨點將只是無關緊要。 – tadman

3

word[0-2]那些破折號失敗。嘗試用..運算符替換它們(導致範圍)。

0

是導致問題的單詞的情況?嘗試使用下面的兩個選項之一:

def vowel_first(word) 
    word[0] =~ /[aeiouAEIOU]/ 
end 

def vowel_first(word) 
    word[0] =~ /[aeiou]/i 
end 

或者更好的是,你並不真的需要提取的信件只是讓正則表達式做所有的工作:

def vowel_first(word) 
    word =~ /^[aeiou]/i 
end 
0

你可以簡單地檢查了在單詞的開頭併發輔音數量:

leading_consonants = word.match(/^[^aeiou]{,3}/)[0].length 

當它是零,這個詞與非輔音開始。根據您的要求,這可能會足夠好;如果你必須考慮到標點​​符號和什麼,你可能需要更聰明點:

matches = word.match(/^([aeiou]?)([^aeiou]{,3})/) 
leading_vowel = matches && matches[1].length > 0 || false 
leading_consonants = matches && matches[2].length || 0 
相關問題