Java replaceAll 无法替换字符串中的字符

Java replaceAll cannot replace a character in a string

我想使用 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 都可以 read/show 这个字符。

我认为 arabibHeh 有问题,因为 text.contains(arabicHeh) 的计算结果也是 false 而它肯定包含 arabicHeh,我认为问题可能出在从JTextPane (String text = txtPane.getText();) 但是当我打印 text 到控制台时,我得到的文本与在 JTextPane 中输入的文本相同,包括 arabicHeh.

任何人都可以解释为什么 text.contains(arabicHeh) 评估为 false 或者为什么代码在 text.replaceAll(arabicHeh, arabicAe) 中不起作用?

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

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

计算为 true

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

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

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

replace() 仍然替换所有出现的地方,但它不使用正则表达式 并且 它有一个接受 char 参数的重载版本。

这段代码对我有用。

当我复制粘贴你的代码片段时,我在 \u0647‌

之后得到了 space
String arabicHeh = "\u0647‌ "; // Arabic Letter Heh

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

只需将它从您的代码片段中删除,一切都会起作用:)