2012-03-17 77 views
2

我想通過將所有非字母表設置爲分隔符來拆分字符串。java與正則表達式拆分字符串

String[] word_list = line.split("[^a-zA-Z]"); 

但具有下列輸入

11:11你好世界

WORD_LIST包含前 「你好」 和 「世界」

敬請許多空字符串告訴我爲什麼。謝謝。

+0

您是否期待以'11:11 Hello World'作爲輸入結果? – MJM 2012-03-17 06:13:26

回答

2

因爲您的正則表達式匹配每個單獨的非alpha字符。這就像分離

",,,,,,Hello,World" 

上的逗號。

你會希望這樣的非字母字符的整個序列在一次如火柴的表達式:

line.split("[^a-zA-Z][^a-zA-Z]*") 

我仍然認爲你會得到一個領先的空字符串與你的例子,因爲它會像分離",Hello,World"如果逗號是你的分隔符。

+1

與[[a-zA-Z] +'相同]。 – blackcompe 2012-03-17 06:12:14

+0

感謝blackcompe。我認爲它會,但不知道,因爲我已經使用了一些正則表達式實現支持+和其他人不支持。不確定Java的String.split()。 – rayd09 2012-03-17 06:17:32

+0

最後,我首先用空字符串替換標題非字母字符,然後用此正則表達式調用split() – Bear 2012-03-17 06:21:29

0

下面會做什麼?

String[] word_list = line.replaceAll("[^a-zA-Z ]","").replaceAll(" +", " ").trim().split("[^a-zA-Z]"); 

我在這裏做的是在拆分之前刪除所有非字母字符,然後用單個空格替換多個空格。

2

這是你的字符串,其中每個字符^顯示[^a-zA-Z]匹配:

11:11 Hello World 
^^^^^^ ^

split方法找到這些比賽,基本上返回^字符之間的所有子。由於在有用數據之前有6個匹配項,因此在得到字符串"Hello"之前,最終會有5個空子串。

爲了防止出現這種情況,您可以手動過濾結果以忽略任何空字符串。

+0

我喜歡你的解釋,因爲它非常清楚。 但我只能給一個勾號,對不起。 – Bear 2012-03-17 06:27:29