因此,对于这个猪拉丁语,我显然跳过了和 \an\in 以及像 a\I 等奇异的东西。我知道这不是主要问题,但如果它不适合您的用例,您可以忽略该逻辑。如果你想用一个或两个辅音保留它,这也适用于三重辅音,然后将表达式从 {1,3} 更改为 {1,2}
所有猪拉丁语都是相似的,因此只需根据您的用例进行更改。MatchData
这是使用对象的好机会。也是vowel?(first_letter=word[0].downcase)
一种风格选择,以提高识字率,因此我不必记住 word[0] 是第一个字母。
我的回答最初是基于 Sergio Tulentsev 在这个帖子中的回答。
def to_pig_latin(sentence)
sentence.gsub('.','').split(' ').collect do |word|
translate word
end.compact.join(' ')
end
def translate(word)
if word.length > 1
if word == 'and' || word == 'an' || word == 'in'
word
elsif capture = consonant_expression.match(word)
capture.post_match.to_s + capture.to_s + 'ay'
elsif vowel?(first_letter=word[0].downcase)
word + 'ay'
elsif vowel?(last_letter=word[-1].downcase)
move_last_letter(word) + 'ay'
end
else
word
end
end
# Move last letter to beginning of word
def move_last_letter(word)
word[-1] + word[0..-2]
end
private
def consonant_expression
# at the beginning of a String
# capture anything not a vowel (consonants)
# capture 1, 2 or 3 occurences
# ignore case and whitespace
/^ [^aeiou] {1,3}/ix
end
def vowel?(letter)
vowels.include?(letter)
end
def vowels
%w[a e i o u]
end
也只是为了它,我将包括我从一个 pry 会话中的转储,这样你们都可以看到如何使用 MatchData。明斯旺。正是这样的东西让红宝石变得很棒。
pry > def consonant_expression
pry * /^ [^aeiou] {1,3}/ix
pry * end
=> :consonant_expression
pry > consonant_expression.match('Stream')
=> #<MatchData "Str">
pry > capture = _
=> #<MatchData "Str">
pry > ls capture
MatchData#methods:
== begin end hash length offset pre_match regexp string to_s
[] captures eql? inspect names post_match pretty_print size to_a values_at
pry >
pry > capture.post_match
=> "eam"
pry > capture
=> #<MatchData "Str">
pry > capture.to_s
=> "Str"
pry > capture.post_match.to_s
=> "eam"
pry > capture.post_match.to_s + capture.to_s + 'ay'
=> "eamStray"
pry >