如何在大写字母上拆分字符串除非前面加上' +'

时间:2014-10-08 15:30:31

标签: ruby regex split

我有一个CamelCased字符串,我希望在大写字母中分成单个单词,除非大写字母前面加上'+':

在Ruby中分割上限非常简单:s.split(/(?=[A-Z])/) 但我无法弄清楚如何添加“除了'+''之外的部分。

例如:

s = "FooBashFizz+BuzzXBar"
p s.split(/(?=[A-Z])/)
=> ["Foo", "Bash", "Fizz+", "Buzz", "X", "Bar"]

期望的:

=> ["Foo", "Bash", "Fizz+Buzz", "X", "Bar"]

2 个答案:

答案 0 :(得分:3)

在开始时添加负面的lookbehind。

irb(main):001:0> s = "FooBashFizz+BuzzXBar"
=> "FooBashFizz+BuzzXBar"
irb(main):002:0> s.split(/(?<!\+)(?=[A-Z])/)
=> ["Foo", "Bash", "Fizz+Buzz", "X", "Bar"]

<强>解释

  • (?<!\+)断言前面的字符可以是任何字符,但不是+符号。
  • (?=[A-Z])断言以下字符必须是大写字母。

答案 1 :(得分:1)

使用String#scan替代方案。这也适用于Ruby 1.8。

s = "FooBashFizz+BuzzXBar"
s.scan(/[A-Z][a-z]*(?:\+[A-Z][a-z]*)*/)
# => ["Foo", "Bash", "Fizz+Buzz", "X", "Bar"]