2014-02-14 1 views
1

Следующий код заменяет специальные символы из строки. Например, «áçç» превращается в «aac».Не могли бы вы объяснить это регулярное выражение (заменяет специальные символы из строки)?

import java.text.Normalizer; 

public class Util { 
    public static String formatString(String s) { 
     String temp = Normalizer.normalize(s, java.text.Normalizer.Form.NFD); 
     return temp.replaceAll("[^\\p{ASCII}]",""); 
     } 
} 

Но, на самом деле, я не понимал, как это работает (я знаю только, что отлично работает). Может ли кто-нибудь объяснить?

+1

Вы даже просмотрели документацию для [Нормализатор] (http://docs.oracle.com/javase/7/docs/api/java/text/Normalizer.html)? – Biffen

ответ

0

NFD разлагает буквы в различных кодовых точек (например, «а» разлагается на «а, комбинируя акут» - - два символа Юникода).

«class» в Java regexes представляет все символы Unicode, которые также являются символами ASCII.

Следовательно, регулярное выражение удалит все символы Юникода, которые являются не ASCII; следовательно, результат.

У Normalizer javadoc есть лучшее объяснение по составлению Юникода {de,}.

1

\ р {ASCII} ==> Все ASCII: [\ x00- \ x7F]

[\x00-\x7F] ==> Этот диапазон имеет ASCII символов. Если значение ascii любого символа находится между этим диапазоном, то найдено совпадение.

[^\\p{ASCII}] ==> Если значение ascii какого-либо символа не попадает между этим диапазоном, найдено совпадение.

Проверьте классы POSIX символов (US-ASCII только) секции Patter class

1

Я уверен, что регулярное выражение добавляется только для того, чтобы убедиться, что ничего «незаконного» не осталось.

Нормализатор делает тяжелый подъем. Согласно javadoc, вы можете проверить «http://www.unicode.org/reports/tr15/tr15-23.html» для получения дополнительной информации о нормализации НФД.

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