Regex: что такое InCombiningDiacriticalMarks?



следующий код очень хорошо известен для преобразования акцентированных символов в обычный текст:



Normalizer.normalize(text, Normalizer.Form.NFD).replaceAll("p{InCombiningDiacriticalMarks}+", "");


Я заменил свой" ручной "метод на этот, но мне нужно понять "регулярное выражение" часть replaceAll



1) Что такое "InCombiningDiacriticalMarks" ?

2) где доказательства этого? (а сходства?)



спасибо.

640   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

    Ничего не найдено.