2015-03-13 23 views
2

我想將兩個連接字符:\ uD800 \ uDC00更改爲x,但奇怪的是它會給出一個奇怪的字符,而不是有人會告訴我這裏出了什麼問題? 當我運行下面的代碼:如何連接正則表達式中的範圍?

System.out.println("\uD800\uDC00".replaceAll("([\uD800-\uDBFF]&&['\uDC00'-'\uDFFF'])", "x")); 

我得到這個字符作爲輸出中

回答

2

首先,在正則表達式中有語法錯誤。模式中的「& &」不應該在那裏。同樣,單引號和括號不應該在那裏。

上面的語法更正是必需的,但並不足夠。 \ u800是一款「神奇」的角色。它與下一個字符結合形成單個4字節的Unicode代碼點:https://en.wikipedia.org/wiki/Universal_Character_Set_characters#Surrogates

使用Unicode代碼點而不是Java字符來解析正則表達式。 \ uD800 \ uDC00是一個單一的Unicode代碼點(0x10000),所以正則表達式不匹配。我想你可能想排除16位範圍\ u0000 - \ uFFFF之外的所有Unicode代碼點。所以這可能是你想要的:

System.out.println("\uD800\uDC00".replaceAll("[^\u0000-\uFFFF]", "x")); 
1

這串

([\uD800-\uDBFF]&&['\uDC00'-'\uDFFF']) 

不會出現在字符串

\uD800\uDC00 

所以「x」不能取代任何東西。

+0

所以我應該使用數組而不是? – Bionix1441 2015-03-13 17:49:43

+0

那麼replaceAll會嘗試在您提供的字符串中找到該子字符串。如果需要替換,則需要提供具有相應子字符串的字符串。 replaceAll僅適用於String。這是一個用replaceAll的例子:[replaceAll](http://stackoverflow.com/questions/20556101/java-replace-all-in-a-string-with) – 2015-03-13 17:50:47

+0

是的,但我想改變這些字符串聯成一個x,所以我不必顯示該squarre – Bionix1441 2015-03-13 17:53:27