Java replaceAll不能替换字符串中的字符

时间:2016-08-23 21:15:55

标签: java regex unicode text-processing

我想使用Java replaceAll(regex, replacement)方法将阿拉伯字母Heh(U + 0647)替换为给定字符串中的阿拉伯字母Ae(U + 06D5)。我有这段代码:

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);

换句话说,当我将阿拉伯字母Heh本身作为replaceAll(regex, replacement)的参数时,代码有效,但我不想在我的代码中编写字符"ه"本身,因为并非所有IDE可以读取/显示此字符。

我认为arabibHeh有问题,因为text.contains(arabicHeh)评估为false,而它肯定包含arabicHeh,我认为可能是问题在于从{获取文本{1}}(JTextPane)但是当我向控制台打印String text = txtPane.getText();时,我会获得与text中输入的相同的文字,包括JTextPane

任何人都可以解释为什么arabicHeh评估为text.contains(arabicHeh)或为什么代码无效false

3 个答案:

答案 0 :(得分:3)

不要使用正则表达式。不要使用String。只需使用普通的char替换:

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

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

replace()仍然会替换所有匹配项,但它不会使用正则表达式它有一个接受char参数的重载版本。

这段代码对我有用。

答案 1 :(得分:2)

当我复制你的片段时,我在\ u0647之后有空间

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

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

只需将其从您的代码段中删除,所有内容都可以正常工作:)

答案 2 :(得分:1)

字体(在您的控制台或应用程序中)可能存在问题,因为两者都是

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

评估为true