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是的,但我认为这需要Ruby1.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是的,但我认为这需要Ruby1.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的。(顺便说一句,我不小心删除了我以前的评论。)