如何在Ruby的子串中拆分CamelCase字符串?

bas*_*ibe 30 ruby regex string-split

我有一个很好的CamelCase字符串,如ImageWideNiceImageNarrowUgly.现在我想在其子串中断掉该字符串,例如Image,WideNarrow,和.NiceUgly.

我认为这可以简单地解决

camelCaseString =~ /(Image)((Wide)|(Narrow))((Nice)|(Ugly))/
Run Code Online (Sandbox Code Playgroud)

但奇怪的是,这样只会填补$1$2,但不会$3.

你有更好的想法拆分那个字符串吗?

Dig*_*oss 56

s = 'nowIsTheTime'

s.split /(?=[A-Z])/

=> ["now", "Is", "The", "Time"]
Run Code Online (Sandbox Code Playgroud)

?=pattern积极前瞻的一个例子. 它基本上匹配模式之前的字符串中的一个点. 它不消耗字符,也就是说,它不包含模式作为匹配的一部分.另一个例子:

    irb> 'streets'.sub /t(?=s)/, '-'
=> "stree-s"
Run Code Online (Sandbox Code Playgroud)

在这种情况下,s匹配(仅第二次t匹配)但不替换.感谢@Bryce和他的正则表达式doc链接.布莱斯安德森补充说明:

?=在年初()的比赛组被称为正向前查找,这是说,虽然正则表达式是在决定是否它匹配看文字,它不是使他们成为比赛的一部分只是一种方式.split()通常吃中间的字符,但在这种情况下,匹配本身是空的,所以没有[那里].

  • 对于那些仍然试图修正正则表达式的人来说,错过答案是对其工作原理的解释.也许有人会觉得这很有用:()匹配组开头的?=被称为"正向前瞻",这只是一种说法,虽然正则表达式在字符中_look_确定它是否匹配,但它不是让他们成为比赛的一部分.split()通常会吃中间字符,但在这种情况下,匹配本身是空的,所以中间没有任何东西.[Regexp docs](http://ruby-doc.org/core-2.1.2/Regexp.html) (7认同)

Fit*_*min 31

我知道这是旧的,但值得一提的是其他可能正在寻找此事的人.在rails中你可以这样做: "NowIsTheTime".underscore.humanize


Tim*_*ott 8

DigitalRoss的答案是正确的,因为它处理一般情况,你不知道它是严格的驼峰情况(第一个字符小写)还是Pascal情况(第一个字母大写).

如果您知道字符串所在的这些表单中的哪一个,或者您想强制使用其中一个,Inflector就可以执行此操作.

对于Pascal案例:

"NowIsTheTime".titleize
Run Code Online (Sandbox Code Playgroud)

对于驼峰案例:

"nowIsTheTime".titleize.camelize :lower
Run Code Online (Sandbox Code Playgroud)