2013-09-30 43 views
1

Java(或任何其他第三方庫)是否提供了一個基於字符代碼替換字符的API(當然在已知的Charset內)而不是正則表達式?例如,要更換一個給定的字符串中的單引號雙引號,一個可以使用:用字符代碼而不是正則表達式替換字符串?

String noDoubles = containsDoubles.replace("\"", "'"); 

然而,對於一個雙引號的UTF-8字符的代碼是U+0022。那麼有什麼可以搜索U+0022字符的實例並用單引號替換它們嗎?

此外,不只是詢問這裏的雙/單引號,我正在談論字符代碼查找和替換任何2個字符。

+2

我個人認爲'「\」「'更清楚你在做什麼,然後''\ u0022''。 – nickb

+0

迴應一些答案已經發布:請勿在U + 0020至U + 007E範圍內使用Unicode文字('\ uhhhh')作爲字符。顯然,想象它們像字符串或字符文字中的其他轉義序列一樣工作(如'\ n'),但事實並非如此;在Java中,它們被解釋得更早並且可能會影響語法。只是爲了好玩,試着在你腦海中猜測它會輸出什麼:'System.out.println(「\ u005c \ u006n」.length());',然後嘗試一下並看看它實際輸出了什麼。 – ajb

+0

@ajb這不會因爲非法的Unicode轉義碼而編譯(不允許使用「n」):http://ideone.com/pMyNY6 –

回答

2

只需使用Unicode的文字:

// I'm using an unicode literal for " 
String noDoubles = containsDoubles.replace('\u0022', '\''); 

以上將任何字符的工作,只要你知道它的相應的代碼。

+2

這不行! ''\ u0027''不會被編譯,因爲'\ u0027'很早就被單引號標記替換了,所以這和'replace'('\ u0022',''');'in你的代碼在語法上不正確。我剛剛嘗試過,編譯器拒絕它。 – ajb

+0

@ajb你是對的,我修好了。請刪除downvote? –

5

使用帶字符的重載版本 - String#replace(char, char)。所以,你可以這樣使用它:

String str = "aa \" bb \""; 
str = str.replace('\u0022', '\''); 
System.out.println(str); // aa ' bb ' 
-1

你也可以使用正則表達式。從Javadoc

\ XHH與十六進制值的字符0xhh

\ Joey:嗯用十六進制值0xhhhh字符

因此,你可以這樣寫:

String noDoubles = containsDoubles.replace("\\u0022", "'"); 
+0

以上不會編譯。編譯器在其處理過程中用實際字符_very_ _early_替換'\ uhhhh'。因此,你的語句的一部分等同於'(「」「,」'「);'這是非法的,因爲你有一個未封閉的引號(我試過了。)另外,'replace'不使用正則表達式('replaceAll ''''''''''''''這個應該可以工作:'replaceAll('\\ u0022「,」'「);'雖然它看起來相當重,只是使用replace(''','\'');'。 – ajb

+0

@ajb噢,謝謝。我最近在螞蟻文件中做了一些正則表達式,你不必逃避逃跑。 :) – joescii