Regex: что такое InCombiningDiacriticalMarks?
следующий код очень хорошо известен для преобразования акцентированных символов в обычный текст:
Normalizer.normalize(text, Normalizer.Form.NFD).replaceAll("p{InCombiningDiacriticalMarks}+", "");
Я заменил свой" ручной "метод на этот, но мне нужно понять "регулярное выражение" часть replaceAll
1) Что такое "InCombiningDiacriticalMarks" ?
2) где доказательства этого? (а сходства?)
спасибо.
2 ответов:
\p{InCombiningDiacriticalMarks}- свойство блока Unicode. В JDK7 вы сможете написать его, используя двухчастную нотацию\p{Block=CombiningDiacriticalMarks}, что может быть понятнее для читателя. Это задокументировано здесь в UAX#44: "база данных символов Юникода".это означает, что кодовая точка попадает в определенный диапазон, блок, который был выделен для использования для вещей с этим именем. Это плохой подход, потому что нет никакой гарантии, что код в этом диапазоне или это не какая-то конкретная вещь, и что кодовые точки вне этого блока не имеют по существу одного и того же символа.
например, есть латинские символы
\p{Latin_1_Supplement}блок, например é, U+00E9. Однако, есть вещи, которые не латинские буквы там тоже. И, конечно, есть также латинские буквы повсюду.блоки почти никогда не то, что вы хотите.
в этом случае я подозреваю, что вы можете использовать свойство
\p{Mn}, а.к.а.\p{Nonspacing_Mark}. Все кодовые точки в блоке Combining_Diacriticals относятся к этому типу. Есть также (по состоянию на Unicode 6.0.0) 1087 Nonspacing_Marks, которые не в этом блоке.это почти то же самое, что проверка на
\p{Bidi_Class=Nonspacing_Mark}, но не совсем, потому что эта группа также включает в себя ограждающие знаки,\p{Me}. Если вы хотите, вы могли бы сказать[\p{Mn}\p{Me}]если вы используете механизм регулярных выражений Java по умолчанию, так как он дает доступ только к General_Category свойство.вам придется использовать JNI, чтобы получить доступ к библиотеке регулярных выражений ICU C++, как это делает Google, чтобы получить доступ к чему-то вроде
\p{BC=NSM}, потому что сейчас только ICU и Perl дают доступ к все свойства Юникода. Обычная библиотека регулярных выражений Java поддерживает только несколько стандартных свойств Unicode. В JDK7 хоть там будет быть поддержка Юникод скрипта propery, который почти бесконечно предпочтительнее свойства блока. Таким образом, вы можете в JDK7 написать\p{Script=Latin}или\p{SC=Latin}, или короткая стрижка\p{Latin}, чтобы добраться до любого символа из латинского алфавита. Это приводит к очень часто[\p{Latin}\p{Common}\p{Inherited}].имейте в виду, что это не будет удалить то, что вы могли бы думать о как "акцент" знаки из всех символов! Есть много людей, для которых это не будет сделано. Например, вы не можете преобразовать § до D или ø до o этак. Для этого вам нужно уменьшить код указывает на те, которые соответствуют той же основной силе сортировки в таблице параметров сортировки Юникода.
другое место, где
\p{Mn}вещь терпит неудачу, конечно, заключая метки, такие как\p{Me}, очевидно, но и есть\p{Diacritic}символы, которые не являются марок. К сожалению, вам нужна полная поддержка свойств для этого, что означает JNI для ICU или Perl. Боюсь, что Java имеет много проблем с поддержкой Unicode.о, подождите, я вижу, вы португалец. Вы должны у вас нет никаких проблем, если вы имеете дело только с португальским текстом.
однако, вы действительно не хотите, чтобы удалить акценты, я уверен, но скорее вы хотите, чтобы иметь возможность соответствовать вещи "акцент нечувствительно", не так ли? Если это так, то вы можете сделать это с помощью ICU4J (ICU для Java) collator class. Если вы сравниваете на основной силе, знаки акцента не будут учитываться. Я делаю это все время, потому что я часто обрабатываю испанский текст. У меня есть пример, как это сделать на испанском сидишь где-нибудь здесь, Если тебе это нужно.
заняло у меня некоторое время, но я выловил их всех:
вот регулярное выражение это должно включать все символы zalgo, включая те, которые обходятся в "нормальном" диапазоне.
([\u0300–\u036F\u1AB0–\u1AFF\u1DC0–\u1DFF\u20D0–\u20FF\uFE20–\uFE2F\u0483-\u0486\u05C7\u0610-\u061A\u0656-\u065F\u0670\u06D6-\u06ED\u0711\u0730-\u073F\u0743-\u074A\u0F18-\u0F19\u0F35\u0F37\u0F72-\u0F73\u0F7A-\u0F81\u0F84\u0e00-\u0eff\uFC5E-\uFC62])надеюсь, это сэкономит вам некоторое время.
Comments