根据特定条件匹配时分割字符串

问题描述:

我想按第一个元音分割字符串。如果下面的字母也是一个元音,那么在它到达序列中的最后一个元音之前,它不能分割。实例是:根据特定条件匹配时分割字符串

  • "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 |我 [“Au”,“xillary”]'是一种方式,不是非常整齐,但似乎工作。 –

+1

@ sagarpandya82根据确切的要求(以及所使用的Ruby的版本),查找也可能是有意义的,例如, '(?

您可以尝试使用以下模式:

([^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

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"]