将camelCase字符串中的每个单词分开,除了某些列出白名单的字符串

时间:2011-09-11 15:33:25

标签: regex

我有一些代码将camelCase字符串拆分成一个句子,每个单词用空格分隔。我已经设法使用正则表达式(?=\p{Lu}),但我现在也想要排除一组应该保持原样的camelCase子串。

例如,如果我要保留的字词是ClassMultiWordClass,我希望:

containsAClassName -> contains A Class Name
containsAMultiWordClassName -> contains A MultiWordClass Name
        (the positions not to match) -->       ^   ^

我的问题是如何扩展该表达式以使我想要保留的单词内的位置不匹配。或者,如果不可能,我可以使用正则表达式和Java的组合来完成它。我已经尝试了一段时间了,并且无法想出一个有效的解决方案。我正在使用Java的正则表达式引擎。

2 个答案:

答案 0 :(得分:1)

这是一个可用于此目的的替换正则表达式:

s/([[:alpha:]](?=[[:upper:]])|MultiWordClass|OtherMultiWordClass)/$1 /g

我用Perl试过,我不确定Java的regexp是否与Perl完全兼容 - 如果没有,它应该很容易适应。

答案 1 :(得分:0)

MultiWordClasses非常棘手,因为您不想在WordClasses部分之间进行拆分。相反,我建议采用与正则表达式不同的策略:在合并结果之前,将字符串标记化并将单个标记转换为其间隔开的版本。这样可以更轻松地跳过列入白名单的令牌。

您可以将每个列入白名单的单词视为潜在令牌,并将每个不包含白名单的子字符串视为令牌。要创建令牌,只需沿着字符串扫描,直到找到一个列入白名单的单词;然后在此之前取出所有内容,将其附加到令牌列表,然后附加白名单;然后重复这个过程,直到你到达字符串的末尾。