2014-10-08 50 views
0

我有一个CamelCased字符串,除非大写字母前加'+',否则我想在大写字母上拆分为单个单词:如何在大写字母上拆分字符串,除非在前面加上'+'

红宝石上的分割相当简单:s.split(/(?=[A-Z])/) 但我无法弄清楚如何添加“除了'+'”部分之外。

例如:

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

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

回答

3

在开始添加的负回顾后发。

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])断言以下字符必须是大写字母。
+0

这不适合我,直到我尝试irb1.9。是否有1.8兼容的解决方案? – AShelly 2014-10-08 15:34:42

+0

不错的一个,Avinash。 ''<!'发生在我身上,但'?='是一个令人惊喜的惊喜。 – 2014-10-08 16:39:16

+0

@CarySwoveland你是我每次触摸红宝石标签时都会鼓励我的人。谢谢sooooooooo muchhhhh .. :-) – 2014-10-08 16:43:07

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"] 
相关问题