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

Java replaceAll无法替换字符串中的字符,java,regex,unicode,text-processing,Java,Regex,Unicode,Text Processing,我想使用JavareplaceAll(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 newT

我想使用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
,但我认为问题可能在于从
JTextPane
获取文本(
String text=txtPane.getText();
)但是,当我将
文本打印到控制台时,我得到的文本与在
JTextPane
中键入的文本相同,包括
arabicHeh


任何人都可以解释为什么
text.contains(arabicHeh)
的计算结果为
false
,或者为什么代码不能在
text.replaceAll(arabicHeh,arabicAe)

字体(在控制台或应用程序中)可能有问题,因为

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

计算结果为
true

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

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

计算结果为
true

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

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

String newText = text.replace(arabicHeh, arabicAe);
replace()
仍然替换所有出现的内容,但它不使用正则表达式,并且它有一个重载版本,可以接受
char
参数


这段代码对我有用。

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

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

String newText = text.replace(arabicHeh, arabicAe);
replace()
仍然替换所有出现的内容,但它不使用正则表达式,并且它有一个重载版本,可以接受
char
参数


这段代码对我很有用。

当我复制粘贴你的代码片段时,我在\u0647之后有了空间‌

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


只需将其从代码段中删除,所有操作都将正常进行:)

当我复制粘贴您的代码段时,我在\u0647之后有了空间‌

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



只需将其从代码片段中删除,所有操作都将正常进行:)

您应该尝试打印
arabicHeh
arabicAe
以查看是否正确您应该包含原始
文本
值抱歉,您的答案不清楚@CSKi试图教你如何钓鱼。不给鱼你应该试着打印
arabicHeh
arabicAe
查看是否正确你应该包括原始
文本
值对不起,你的答案不清楚@CSKi试图教你如何钓鱼。我没有给fishThan你的评论,当我运行你的代码时,两行都是false。我尝试了不同的IDE:netbeanside8.1和面向Web开发人员的eclipsejavaeeide(Mars.2版本(4.5.2))。在这两个IDE中,我都得到了false。我认为问题在于
arabicHeh
,因为当我尝试其他字符时,我得到了true,例如:
String arabicKaf=“\u0643”//阿拉伯文字母Kaf字符串arabicKeheh=“\u06A9”//阿拉伯文字母Keheh System.out.println(“\u0643.replaceAll(arabicKaf,arabicKeheh).equals(“\u06A9”);System.out.println(“\u06A9.replaceAll(arabicKeheh,arabicKaf).equals(“\u0643”)
@DelmanAbdullah它可能也是一个jdk bug。您使用什么java版本?我使用这个JDK:java版本“1.8.0_77”java(TM)SE运行时环境(build 1.8.0_77-b03)java HotSpot(TM)64位服务器VM(build 25.77-b03,混合模式)作为您的注释,当我运行您的代码时,两行的值都为false。我尝试了不同的IDE:netbeanside8.1和面向Web开发人员的eclipsejavaeeide(Mars.2版本(4.5.2))。在这两个IDE中,我都得到了false。我认为问题在于
arabicHeh
,因为当我尝试其他字符时,我得到了true,例如:
String arabicKaf=“\u0643”//阿拉伯文字母Kaf字符串arabicKeheh=“\u06A9”//阿拉伯文字母Keheh System.out.println(“\u0643.replaceAll(arabicKaf,arabicKeheh).equals(“\u06A9”);System.out.println(“\u06A9.replaceAll(arabicKeheh,arabicKaf).equals(“\u0643”)
@DelmanAbdullah它可能也是一个jdk bug。您使用的是什么java版本?我使用的是JDK:java版本“1.8.0_77”java(TM)SE运行时环境(build 1.8.0_77-b03)java HotSpot(TM)64位服务器虚拟机(build 25.77-b03,混合模式)非常感谢您,先生,您说得对,这里有一个隐藏字符(ZWNJ),肉眼无法看到。我正在处理非英语(库尔德语索拉尼语)文本,也许在切换键盘时我输入了这个隐藏字符。非常感谢,先生,你说得对,这里有一个隐藏字符(ZWNJ),肉眼看不见。我正在处理非英语(库尔德语索拉尼语)文本,可能在切换键盘时我输入了这个隐藏字符。非常感谢您的评论,您的代码工作得很好,但很抱歉,我无法将其标记为正确答案,因为@Denis Kurochkin发现了我代码中的错误。非常感谢您的评论,您的代码运行得非常好,但很抱歉,我无法将其标记为正确答案,因为@Denis Kurochkin在我的代码中发现了错误。