2016-08-23 2 views
1

Я хочу заменить арабскую букву Heh (U + 0647) на арабскую букву Ae (U + 06D5) в данной строке, используя метод Java replaceAll(regex, replacement). У меня есть этот код: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)?

+0

вы должны попробовать для печати 'arabicHeh'or' arabicAe', чтобы увидеть, правильно ли это – CSK

+0

Вы должны указать исходное значение 'text' – 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

Чем вы за ваш комментарий, когда я запускаю ваш код, я получаю false для обеих строк. Я пробовал разные IDE: NetBeans IDE 8.1 и Eclipse Java EE IDE для веб-разработчиков (выпуск Mars.2 (4.5.2)). В обеих IDE я ошибаюсь. –

+0

Я думаю, что проблема заключается в 'arabicHeh', потому что когда я пытаюсь использовать другие символы, я становлюсь истинным, например:' String arabicKaf = "\ u0643"; // Арабское письмо Kaf String arabicKeheh = "\ u06A9"; // Arabic Letter Keheh \t \t System.out.println ("\ u0643" .replaceAll (arabicKaf, arabicKeheh) .equals ("\ u06A9")); \t System.out.println ("\ 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 нашел ошибку в моем коде. –

Смежные вопросы