Java replaceAll不能替换字符串中的字符
我想用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
,我想可能是从JTextPane
(String text = txtPane.getText();
)获取文本的问题,但是当我打印text
安慰我得到了相同的文字如输入JTextPane
,包括arabicHeh
。
任何人都可以解释为什么text.contains(arabicHeh)
评估为false
或为什么代码在text.replaceAll(arabicHeh, arabicAe)
中不工作?
当我copypasted你的片段我后\有空间u0647
String arabicHeh = "\u0647 "; // Arabic Letter Heh
这是https://en.wikipedia.org/wiki/Zero-width_non-joiner
只是从你的代码片段删除它,一切都将工作:)
非常感谢您的先生,您有一个隐藏的角色(ZWNJ),肉眼无法看到。我正在处理非英语(库尔德索拉尼)文本,也许在切换键盘时我错误地键入了这个隐藏的字符 –
这可能是与字体(在控制台或应用程序)的一个问题,因为这两个
"\u0647".replaceAll(arabicHeh, arabicAe).equals("\u06D5")
"\u06D5".replaceAll(arabicAe, arabicHeh).equals("\u0647")
评估为true
。
比你的评论,当我运行你的代码我得到两条线的假。我尝试了不同的IDE:针对Web开发人员的NetBeans IDE 8.1和Eclipse Java EE IDE(Mars.2 Release(4.5.2))。在这两个IDE中,我都会犯错。 –
我认为问题是'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”));' –
@DelmanAbdullah它也可能是一个jdk错误。你用什么java版本? – vsminkov
不要使用正则表达式。请勿使用String
。只需使用简单的字符替换:
char arabicHeh = 0x0647;
char arabicAe = 0x06D5;
String newText = text.replace(arabicHeh, arabicAe);
replace()
还是替换所有出现的,但它不使用正则表达式和它有一个重载版本接受char
参数。
此代码适用于我。
非常感谢您的评论,您的代码工作得很好,但遗憾的是,自从@Denis Kurochkin在我的代码中发现错误后,我无法将其标记为正确的答案。 –
你应该尝试打印'阿拉伯语'或'阿拉伯语'看看是否正确 – CSK
您应该包含原始的'文字'值 – Andremoniy
对不起,您的回答不明确。 @CSK –