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
只需将它从您的代码片段中删除,一切都会起作用:)
我想使用 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
之后得到了 spaceString arabicHeh = "\u0647 "; // Arabic Letter Heh
是https://en.wikipedia.org/wiki/Zero-width_non-joiner
只需将它从您的代码片段中删除,一切都会起作用:)