Ruby 在匹配特定条件时拆分字符串

Ruby 在匹配特定条件时拆分字符串,ruby,regex,string,Ruby,Regex,String,我想用第一个元音分开一根弦。如果下面的字母也是元音,则在到达序列中的最后一个元音之前,不得拆分。例如: “辅助”=>[“辅助”] “门把手”=>[“Doo”“rknob”] “绿色”=>[“绿色”n] 我做到了: "Auxiliary".split("u") # => ["A", "uxiliary"] 我需要在赛后分手,而不是在赛前。我不确定我是否可以做类似于“辅助”.split(/[aeiouAEIOU]/);这只会在第一次找到元音时分割。您可以尝试使用以下模式: ([^aeio

我想用第一个元音分开一根弦。如果下面的字母也是元音,则在到达序列中的最后一个元音之前,不得拆分。例如:

  • “辅助”
    =>
    [“辅助”]
  • “门把手”
    =>
    [“Doo”“rknob”]
  • “绿色”
    =>
    [“绿色”n]
我做到了:

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

我需要在赛后分手,而不是在赛前。我不确定我是否可以做类似于
“辅助”.split(/[aeiouAEIOU]/)
;这只会在第一次找到元音时分割。

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

([^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
此处演示:

Au
xiliary
Doo
rknob
Gree
n

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

([^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
此处演示:

Au
xiliary
Doo
rknob
Gree
n

您使用的是什么版本的Ruby?
“Auxilary”.split(/([aeiou]{2})/i.partition.with_index{| |,i | i[“Au”,“xillary”]
是一种方法,不是很简洁,但似乎很有效。@sagarpandya82根据具体的要求(以及使用的Ruby版本),环顾一下可能也有意义,例如
(?Ruby版本:2.3.0&感谢您的建议sagarpandya2,非常感谢您的帮助!不过,我实际上同意了Tim下面的答案,它非常有效。@TimBiegeleisen哦,是的,我现在明白了,您的意思是
“辅助”。split(/(?[“Au”,“xillary”]
,效果很好。@IainK别担心,Tim的答案很好,他在这篇评论中也给出了答案。你使用的Ruby版本是什么?
“辅助”。split(/([aeiou]{2})/i)。partition.with|index{uu,i | i[“Au”,“xillary”]
是一种方法,不是很整洁,但似乎可以工作。@sagarpandya2(以及正在使用的Ruby版本),环顾一下可能也有意义,例如
(?Ruby版本:2.3.0&感谢sagarpandya2的建议,非常感谢您的帮助!不过,我实际上同意Tim下面的答案,它非常有效。@TimBiegeleisen哦,是的,我现在明白了,您的意思是
“辅助”。split(/(?[“Au”,“xillary”]
,效果很好。@我想不用担心,Tim的答案很好,他也在这篇评论中给出了答案。很好,重构建议:
scan(/([^aeiou]*[aeiou]+)(.*)/i)
@CarySwoveland是的,但我认为这需要Ruby
1.9或更高版本。我使用的是Ruby版本2.3.0。哦,谢谢你的回答,蒂姆,这很好。我也非常感谢你的解释!一件小事:对于
R=/([^aeiou]*[aeiou]+)(.*/I
“ba.scan(R)\=>[“ba”,“bb.scan”
(R) #=>[]
。可能更有用的方法是编写
“ba.scan(R).在
中首先和拒绝{a | a.empty?}bb.扫描(R).首先和拒绝{a | a.empty?}nil
第一和
是Ruby的。(顺便说一句,我不小心删除了我以前的评论。)很好,建议:
扫描(//*aeu++]
@CarySwoveland是的,但我认为这需要Ruby
1.9或更高版本。我使用的是Ruby版本2.3.0。哦,谢谢你的回答,蒂姆,这很好。我也非常感谢你的解释!一件小事:对于
R=/([^aeiou]*[aeiou]+)(.*/I
“ba.scan(R)\=>[“ba”,“bb.scan”
(R) #=>[]
。写
“ba.scan(R)”可能更有用。在
中,first&.reject{a | a.empty?}#=>[“ba”]“bb”。scan(R)。first&.reject{a | a.empty?}nil
中的first&
是Ruby的。(顺便说一句,我不小心删除了我以前的评论。)