2017-04-18 112 views
1

我想按第一個元音分割字符串。如果下面的字母也是一個元音,那麼在它到達序列中的最後一個元音之前,它不能分割。實例是:根據特定條件匹配時分割字符串

  • "Auxiliary" =>["Au" "xiliary"]
  • "Doorknob" =>["Doo" "rknob"]
  • "Green" =>["Gree" "n"]

我所做的:

"Auxiliary".split("u") 
# => ["A", "uxiliary"] 

我需要在比賽後分裂,而不是之前。我不確定我是否可以做類似"Auxiliary".split(/[aeiouAEIOU]/);這隻會在第一次發現元音時分裂。

+0

您使用的是哪個版本的Ruby? –

+0

「輔助」.split(/([aeiou] {2})/ i).partition.with_index {| _,i |我<= 1} .map(&:join)#=> [「Au」,「xillary」]'是一種方式,不是非常整齊,但似乎工作。 –

+1

@ sagarpandya82根據確切的要求(以及所使用的Ruby的版本),查找也可能是有意義的,例如, '(?<= [AEIOU])'。 –

回答

5

您可以嘗試使用以下模式:

([^aeiou]*[aeiou]+)(.*) 

([^aeiou]*[aeiou]+) match and capture zero or more continuous non vowels 
         followed by one or more vowels 
(.*)     then capture the remainder of the string 

puts "Auxiliary".scan(/([^aeiou]*[aeiou]+)(.*)/i) 
puts "Doorknob".scan(/([^aeiou]*[aeiou]+)(.*)/i) 
puts "Green".scan(/([^aeiou]*[aeiou]+)(.*)/i) 

輸出:

Au 
xiliary 
Doo 
rknob 
Gree 
n 

演示在這裏:

Rextester

+1

不錯,重構建議:'scan(/([^ aeiou] * [aeiou] +)(。*)/ i)' –

+0

@CarySwoveland是的,但我認爲這需要Ruby 1.9或更高版本。 –

+1

我使用Ruby版本2.3.0。 哦,謝謝Tim的回答,這個工作很完美。 :)我也很欣賞這個解釋! – IainK

2
R =/
    \A  # match beginning of string 
    [^aeiou]* # match zero or more non-vowels 
    [aeiou]+ # match one or more vowels 
    /ix  # case-indifferent and free-spacing regex definition modes 

def split_after_vowels(str) 
    return nil unless str =~ R 
    i = Regexp.last_match.end(0) 
    [str[0,i], str[i..-1]] 
end 

split_after_vowels 'Aardvark' 
    #=> ["Aa", "rdvark"] 
split_after_vowels 'taught' 
    #=> ["tau", "ght"] 
split_after_vowels 'zzzzzz' 
    #=> nil 
split_after_vowels 'zzzzzz sleep' 
    #=> ["zzzzzz slee", "p"]