2014-08-28 67 views
1

我需要用連字符將字符串分解成單詞。例如:如何編寫這個Java正則表達式?

「WorkInProgress」轉換爲「工作進行中」

「NotComplete」轉換爲「NotComplete」

大多數情況下,有一個詞的資本開始,以小寫。

但是有一個例外,「CIInProgress」應該轉換爲「CI-In-Progress」。

我寫的代碼如下,任何小寫或「CI」的模式,後跟一個大寫,都會在中間加上「 - 」。但它仍然不能用於「CIInProgress」。任何人都可以告訴我如何改正它?

String str; 
String pattern = "([a-z|CI]+)([A-Z])"; 
str= str.replaceAll(pattern, "$1\\-$2"); 
+0

你必須明白,一個字符類是隻有字符的集合,而不是字符串的集合。 '[A | BC]'表示「A」或「|」或「B」或「C」,與「[B | CA]」或「[| CBA]」相同' – 2014-08-28 01:37:21

回答

3

你可以使用一個負回顧後,

正則表達式:

(?<!^)([A-Z][a-z]) 

替換字符串:

-$1 

DEMO

說明:

(?<!^)負回顧後在此使用,其中所斷言的前進字符[A-Z](大寫)以及以下[a-z](小寫)不是一個起始錨定件。只有滿足上述條件時,大寫字母和下面的小寫字母纔會匹配。 ()捕獲組用於捕獲匹配的字符,捕獲的字符被存儲到組中。稍後,您可以通過引用它的組索引號來獲取捕獲的字符。

代碼:

System.out.println("WorkInProgress".replaceAll("(?<!^)([A-Z][a-z])", "-$1")); 
System.out.println("NotComplete".replaceAll("(?<!^)([A-Z][a-z])", "-$1")); 
System.out.println("CIInProgress".replaceAll("(?<!^)([A-Z][a-z])", "-$1")); 

輸出:

Work-In-Progress 
Not-Complete 
CI-In-Progress 
+0

這是一個通用解決方案。 – 2014-08-28 01:48:21

2

你不能在一個字符類|;它會被解釋爲一個文字垂直欄字符。嘗試:

String pattern = "([a-z]+|CI)([A-Z])"; 
2

試試這個

str= str.replaceAll("(?<=\\p{javaLowerCase})(?=\\p{javaUpperCase})", "-"); 
+0

我不知道這些字符類! – 2014-08-28 01:53:57

+0

任何在Character類中以「is」開頭的方法都可以在Java正則表達式中用作\ p {javaMethodNameWithoutIs} – 2014-08-28 01:59:41

+0

感謝ЕвгенийОнегин(EugèneOnéguine):),它是一個很棒的助記符工具。 – 2014-08-28 02:06:52