我想使用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
?
答案 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
。