2011-09-11 26 views
2

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

例如,如果我想保存的话是ClassMultiWordClass,我会想:

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

我的问题是我怎么可以扩展表达式不匹配我想要的话内侧的位置保存。或者可能的话,如果这是不可能的,我如何使用正则表达式和Java的组合来实现它。我一直在尝试一段时间,并且无法提出可行的解决方案。我正在使用Java的正则表达式引擎。

回答

1

这里有一个替代的正则表达式,你可以使用这个目的:

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

我试过用Perl,我不知道Java的正则表达式与Perl的完全兼容 - 如果不是,它应该很容易适应。

+1

我修改了一些模式(MultiWordClass | Class | \ p {L})(?= \ p {Lu} | $)',以确保识别单词的部分匹配不匹配。 (L = unicode字母,Lu = unicode字母大写) – henko

+0

对,我没有考虑到这一点。 –

0

MultiWordClasses很棘手,因为您不想在WordClasses零件之间进行拆分。相反,我会建议一种与正则表达式不同的策略:在合并结果之前,标记您的字符串并将单个令牌转换为它们的间隔外的版本。这使得跳过列入白名单的令牌变得更容易。

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

+0

其实,在单词的情况下,不需要改变 - 我目前的模式已经按预期解析它。它是Multi/Word和Word/Class之间的分隔符,我想*不匹配。 – henko

+0

对,对。编辑答案反映了这一点。 – Amber

相关问题