2016-08-23 94 views
1

我想用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,我想可能是从JTextPaneString text = txtPane.getText();)获取文本的问题,但是当我打印text安慰我得到了相同的文字如输入JTextPane,包括arabicHeh

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

+0

你应该尝试打印'阿拉伯语'或'阿拉伯语'看看是否正确 – CSK

+0

您应该包含原始的'文字'值 – Andremoniy

+1

对不起,您的回答不明确。 @CSK –

回答

2

当我copypasted你的片段我后\有空间u0647

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

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

只是从你的代码片段删除它,一切都将工作:)

+0

非常感谢您的先生,您有一个隐藏的角色(ZWNJ),肉眼无法看到。我正在处理非英语(库尔德索拉尼)文本,也许在切换键盘时我错误地键入了这个隐藏的字符 –

1

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

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

评估为true

+0

比你的评论,当我运行你的代码我得到两条线的假。我尝试了不同的IDE:针对Web开发人员的NetBeans IDE 8.1和Eclipse Java EE IDE(Mars.2 Release(4.5.2))。在这两个IDE中,我都会犯错。 –

+0

我认为问题是'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”));' –

+0

@DelmanAbdullah它也可能是一个jdk错误。你用什么java版本? – vsminkov

3

不要使用正则表达式。请勿使用String。只需使用简单的字符替换:

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

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

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

此代码适用于我。

+0

非常感谢您的评论,您的代码工作得很好,但遗憾的是,自从@Denis Kurochkin在我的代码中发现错误后,我无法将其标记为正确的答案。 –