2013-10-21 33 views
2

我試圖將字符串拆分爲字符串數組,問題是.split()也返回空元素。 ("test").split將返回["","t","e","s","t"]Java將字符串拆分爲字符使用負面預讀

此問題的解決方案Split string into array of character strings解決了問題(使用.split("(?!^)"))。

但是,我仍然不明白爲什麼這個工作,我不打算使用一段代碼,我不明白,只是因爲它完成了工作。

我讀過這兩頁http://www.regular-expressions.info/lookaround.htmlhttp://ocpsoft.org/opensource/guide-to-regular-expressions-in-java-part-2/關於負向前瞻,仍然無法理解。有人可以澄清這一點嗎?

+2

爲什麼不使用String#toCharArray();' – anubhava

+0

程序中使用的一個類中有一個屬性定義爲String,此屬性用於與輸入的字母進行比較。 – user1493813

回答

5

使用("test").split()會在字符前的每個位置拆分字符串,結果爲["", "t", "e", "s", "t"],因爲第一個拆分(位於t前面)將導致空條目。

此正則表達式("(?!^)")是否意味着:分割字符串在每個人的性格,哪裏都不行啓動(^)是前一個字符 *:

你的字符串基本上看起來(爲正則表達式引擎)像這樣:^test$ 所以,正則表達式將執行每個拆分,除了在第一個t之前的拆分,因爲它匹配^ - 並且它不應該拆分,當前位置前的字符是^(String /直接起動)。

* actualley ^不是一個字符,這就是爲什麼你沒有在$之前進行另一次拆分 - 它們只是元字符 - 可以這麼說。

+0

現在我明白了,感謝您提供清晰簡潔的答案。 – user1493813

1

嗯,大概我不明白你的問題,但爲什麼不使用toCharArray()方法?

2

您需要先理解爲什麼返回的數組包含空的第一個元素。當您在索引0處發生的分隔符上拆分字符串時,它也將在該分隔符上拆分。現在分隔符的左側是一個空字符串,它被存儲在數組的索引0處。

所以,下面的代碼,將給予第一個數組元素爲空字符串:

"#ab#c".split("#"); // ["", "ab", "c"] 

但是,如果#不是字符串的第一個字符,你就不會得到一個空字符串在索引0.

現在,如果您不想將空字符串作爲第一個元素,您只需要避免第一個#分裂。你會怎麼做?只要確保#要拆分上是不是在字符串的開頭 - ^,通過使用負向後看:

"#ab#c".split("(?<!^)#"); // ["ab", "c"] 

此正則表達式分割上#當它不被串(?<!^)的開始之前。 ^表示字符串的開始,並且(?<!...)表示負面後顧。


所以,現在你的分隔符是一個空字符串本身。記住,一個字符串在每個字符之前和最後一個字符之後都包含一個空字符串。所以,簡單地分割空字符串,將分裂在第一個字符之前的分隔符處。你需要拆分空字符串,除了開頭的字符串。用空字符串替換#

"abc".split("(?<!^)"); // ["a", "b", "c"] 

同樣負前瞻作品 - (?!^),但IMO,負向後看更直觀這裏。


當然,如果你只是想打破字符串轉換成字符數組,你可以使用String#toCharArray()方法。

相關問題