2011-09-11 68 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

相關問題