正则表达式在Groovy中拆分大写,大写,小写模式

时间:2013-09-12 15:55:02

标签: regex groovy

我正在尝试将camelcase字符串拆分为单个单词,同时保留大写字母串。例如,“fooBarABABFooBar”应该变成“foo bar ABAB foo bar”。有一些要求。像“ABAB”这样的缩写应保持大写,但其他单词的第一个字母应为小写。我有一些运气使用以下正则表达式分解骆驼案例:

def str = "fooBarABABFooBar"
println str.replaceAll(/(?<=[a-z])(?=[A-Z])/) { ' ' + it }

这让我觉得“foo Bar ABABFoo Bar”。我已经能够从这个到“foo Bar A B A B Foo Bar”,但没有达到预期的输出。有任何想法吗?谢谢!

1 个答案:

答案 0 :(得分:1)

尝试以下表达式:

(?=[A-Z][a-z])|(?<=[a-z])(?=[A-Z])

正如您所看到的,我已经使用了您原来的想法并对其进行了一些修改。我注意到在你的表达式(?<=[a-z])(?=[A-Z])中,你试图匹配有小写字母后跟大写字母的位置,好的工作。

现在我已经进一步研究了这个想法,并注意到还有其他重要的位置,即(?=[A-Z][a-z])或换句话说:匹配位置,其中有一个大写后跟小写,如Foo因为这可能是骆驼的情况。

我的表达式符合以下职位:

foo BarABAB Foo Bar
   ^       ^   ^

注意剩下一个位置,现在轮到您的表达式,它会计算以下位置:

foo Bar ABAB Foo Bar
       ^

所以当我的表情失败时,你的成功,反之亦然。所以现在他们两个在一起匹配:

foo Bar ABAB Foo Bar
   ^   ^    ^   ^