2010-09-20 74 views

回答

88

您可以使用正規零寬度正預測先行 - 它發現大寫字母,但不包括他們進入分隔符:

String s = "thisIsMyString"; 
String[] r = s.split("(?=\\p{Upper})"); 

Y(?=X)比賽Y其次X,但不包括X成比賽。所以(?=\\p{Upper})匹配一個空的序列後跟一個大寫字母,split使用它作爲分隔符。

有關Java正則表達式語法的更多信息,請參閱javadoc

編輯:順便說一下,它也不適用於thisIsMyÜberString。對於非ASCII大寫字母,你需要一個Unicode大寫字符類,而不是POSIX之一:

String[] r = s.split("(?=\\p{Lu})"); 
+2

+1,你是第一個(幾秒),+說明+預定義的上層階級:) – Bozho 2010-09-20 15:03:05

+1

要知道,如果上字符是最後的字符串中您將不會收到一個空洞的超越它的位,例如拆分「H2W」將返回{「」,「2」},其中「」是「H」之前的位,「2」是位於中間的位。通常不是問題,但它可以打破關於返回多少部分的假設。 – locka 2010-09-20 16:25:37

+0

@locka:除了明確檢查外,是否有解決方法? – Jeremy 2011-03-09 17:54:31

16
String[] camelCaseWords = s.split("(?=[A-Z])"); 
+1

不適用於「thisIsMyÜberString」。 – jarnbjo 2010-09-20 15:05:14

+1

axtavt已經給了Guido的問題一個正確的答案,那麼爲什麼要回答兩次?你的回答是錯誤的,所以我低估了它並指出了原因。 – jarnbjo 2010-09-20 15:11:37

+0

@jarnbjo他的回答最初並不適用於元音變音。 – Bozho 2010-09-20 15:41:59

5

由於String::split需要一個正則表達式,你可以使用一個前瞻:

String[] x = "thisIsMyString".split("(?=[A-Z])"); 
0

嘗試這個;

static Pattern p = Pattern.compile("(?=\\p{Lu})"); 
String[] s1 = p.split("thisIsMyFirstString"); 
String[] s2 = p.split("thisIsMySecondString"); 

... 
10

對於任何人想知道的格局是怎麼當分割字符串可能以大寫字母開頭:

String s = "ThisIsMyString"; 
String[] r = s.split("(?<=.)(?=\\p{Lu})"); 
System.out.println(Arrays.toString(r)); 

給出:這是我的,字符串]

+0

這是**不是**原始問題的答案。要批評或要求作者澄清,在他們的帖子下留下評論 - 你總是可以評論你自己的帖子,一旦你有足夠的[聲譽](http://stackoverflow.com/help/whats-reputation),你會能夠[評論任何帖子](http://stackoverflow.com/help/privileges/comment)。 – DavidPostill 2014-12-08 10:07:52

+0

感謝您的補充! – serj 2016-06-02 14:06:54

0

這個正則表達式將在Caps上分開,省略第一個。所以它應該適用於駱駝案件和適當案件。

(?<=.)(?=(\\p{Upper})) 

TestText = Test, Text 
thisIsATest = this, Is, A, Test