2016-08-23 75 views
1

我想用Java replaceAll(regex, replacement)方法將給定字符串中的阿拉伯字母Heh(U + 0647)替換爲阿拉伯字母Ae(U + 06D5)。我有這樣的代碼:Java replaceAll不能替換字符串中的字符

String arabicHeh = "\u0647‌"; // Arabic Letter Heh 
String arabicAe = "\u06D5"; // Arabic Letter Ae    

String text = txtPane.getText(); 
String newText = text.replaceAll(arabicHeh, arabicAe); 

當我打印newText變量不會發生任何變化,信arabicHeh的字符串中仍然存在。

注:該代碼的工作,當我把它寫在這樣:

String newText = text.replaceAll("ه", arabicAe); 

換句話說,代碼工作時,我讓阿拉伯字母嘿本身作爲參數傳遞給replaceAll(regex, replacement),但我不想要在我的代碼中寫入"ه"本身的字符,因爲並非所有IDE都能讀取/顯示此字符。

我認爲arabibHeh有問題,因爲還text.contains(arabicHeh)評估爲false,同時它肯定包含arabicHeh,我想可能是從JTextPaneString text = txtPane.getText();)獲取文本的問題,但是當我打印text安慰我得到了相同的文字如輸入JTextPane,包括arabicHeh

任何人都可以解釋爲什麼text.contains(arabicHeh)評估爲false或爲什麼代碼在text.replaceAll(arabicHeh, arabicAe)中不工作?

+0

你應該嘗試打印'阿拉伯語'或'阿拉伯語'看看是否正確 – CSK

+0

您應該包含原始的'文字'值 – Andremoniy

+1

對不起,您的回答不明確。 @CSK –

回答

2

當我copypasted你的片段我後\有空間u0647

String arabicHeh = "\u0647‌ "; // Arabic Letter Heh 

這是https://en.wikipedia.org/wiki/Zero-width_non-joiner

只是從你的代碼片段刪除它,一切都將工作:)

+0

非常感謝您的先生,您有一個隱藏的角色(ZWNJ),肉眼無法看到。我正在處理非英語(庫爾德索拉尼)文本,也許在切換鍵盤時我錯誤地鍵入了這個隱藏的字符 –

1

這可能是與字體(在控制檯或應用程序)的一個問題,因爲這兩個

"\u0647".replaceAll(arabicHeh, arabicAe).equals("\u06D5") 
"\u06D5".replaceAll(arabicAe, arabicHeh).equals("\u0647") 

評估爲true

+0

比你的評論,當我運行你的代碼我得到兩條線的假。我嘗試了不同的IDE:針對Web開發人員的NetBeans IDE 8.1和Eclipse Java EE IDE(Mars.2 Release(4.5.2))。在這兩個IDE中,我都會犯錯。 –

+0

我認爲問題是'arabicHeh',因爲當我嘗試其他字符時,我會變爲true,例如:'String arabicKaf =「\ u0643」; //阿拉伯字母Kaf String arabicKeheh =「\ u06A9」; //阿拉伯文字母Keheh \t \t System.out.println(「\ u0643」.replaceAll(arabicKaf,arabicKeheh).equals(「\ u06A9」)); (「\ u06A9」.replaceAll(arabicKeheh,arabicKaf).equals(「\ u0643」));' –

+0

@DelmanAbdullah它也可能是一個jdk錯誤。你用什麼java版本? – vsminkov

3

不要使用正則表達式。請勿使用String。只需使用簡單的字符替換:

char arabicHeh = 0x0647; 
char arabicAe = 0x06D5; 

String newText = text.replace(arabicHeh, arabicAe); 

replace()還是替換所有出現的,但它不使用正則表達式它有一個重載版本接受char參數。

此代碼適用於我。

+0

非常感謝您的評論,您的代碼工作得很好,但遺憾的是,自從@Denis Kurochkin在我的代碼中發現錯誤後,我無法將其標記爲正確的答案。 –