Regex: qu’est-ce que InCombiningDiacriticalMarks?

Le code suivant est très connu pour convertir des caractères accentués en texte brut:

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

J’ai remplacé ma méthode “faite à la main” par celle-ci, mais j’ai besoin de comprendre la partie “regex” de la

1) Qu’est-ce que “InCombiningDiacriticalMarks”?
2) Où en est la documentation? (et similaires?)

Merci.

\p{InCombiningDiacriticalMarks} est une propriété de bloc Unicode. Dans JDK7, vous pourrez l’écrire en utilisant la notation en deux parties \p{Block=CombiningDiacriticalMarks} , qui peut être plus claire pour le lecteur. Il est documenté ici dans UAX # 44: “La firebase database de caractères Unicode” .

Cela signifie que le sharepoint code se situe dans une plage particulière, un bloc qui a été atsortingbué à utiliser pour les choses par ce nom. C’est une mauvaise approche, car rien ne garantit que le sharepoint code dans cette plage est ou n’est pas une chose particulière, ni que les points de code en dehors de ce bloc n’ont pas le même caractère.

Par exemple, il y a des lettres latines dans le bloc \p{Latin_1_Supplement} , comme é, U + 00E9. Cependant, il y a aussi des choses qui ne sont pas des lettres latines. Et bien sûr, il y a aussi des lettres latines partout.

Les blocs ne sont presque jamais ce que vous voulez.

Dans ce cas, je pense que vous pourriez vouloir utiliser la propriété \p{Mn} , alias \p{Nonspacing_Mark} . Tous les points de code du bloc Combining_Diacriticals sont de ce type. Il existe également (à partir d’Unicode 6.0.0) 1087 Nonspacing_Marks qui ne sont pas dans ce bloc.

Cela revient presque à vérifier \p{Bidi_Class=Nonspacing_Mark} , mais pas tout à fait, car ce groupe inclut également les marques englobantes, \p{Me} . Si vous voulez les deux, vous pouvez dire [\p{Mn}\p{Me}] si vous utilisez un moteur de regex Java par défaut, car il donne uniquement access à la propriété General_Category.

Vous devrez utiliser JNI pour accéder à la bibliothèque de regex C ++ ICU comme le fait Google pour accéder à quelque chose comme \p{BC=NSM} , car pour le moment, seules ICU et Perl donnent access à toutes les propriétés Unicode. La bibliothèque regex Java normale ne prend en charge que quelques propriétés Unicode standard. Dans JDK7, il y aura cependant un support pour la propriété Script Unicode, qui est presque infiniment préférable à la propriété Block. Ainsi, vous pouvez écrire dans JDK7 \p{Script=Latin} ou \p{SC=Latin} ou le raccourci \p{Latin} pour obtenir n’importe quel caractère du script latin. Cela conduit au très communément requirejs [\p{Latin}\p{Common}\p{Inherited}] .

Sachez que cela ne supprimera pas ce que vous pourriez penser comme des marques «accentuées» de tous les personnages! Il y en a beaucoup pour qui ne le fera pas. Par exemple, vous ne pouvez pas convertir Đ en D ou ø de cette manière. Pour cela, vous devez réduire les points de code à ceux qui correspondent à la même force de classement primaire dans la table de classement Unicode.

Un autre endroit où la chose \p{Mn} échoue est bien sûr de contenir des marques comme \p{Me} , évidemment, mais il y a aussi des caractères \p{Diacritic} qui ne sont pas des marques. Malheureusement, vous avez besoin d’un support complet pour cela, ce qui signifie JNI pour ICU ou Perl. Java a beaucoup de problèmes avec le support Unicode, j’ai bien peur.

Oh, attends, je vois que tu es portugais. Vous ne devriez avoir aucun problème si vous ne traitez que du texte en portugais.

Je parie que vous ne voulez pas vraiment supprimer les accents, mais plutôt que vous voulez pouvoir faire correspondre les choses «insensiblement», non? Si c’est le cas, vous pouvez le faire en utilisant la classe d’assembleur ICU4J (ICU for Java) . Si vous comparez à la force principale, les marques d’accent ne comptent pas. Je le fais tout le temps parce que je traite souvent du texte espagnol. J’ai un exemple de la façon de faire cela pour l’espagnol assis quelque part si vous en avez besoin.

Il m’a fallu du temps, mais je les ai tous pêchés:

Voici la regex qui devrait inclure tous les caractères zalgo, y compris ceux ignorés dans la plage “normale”.

 ([\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]) 

J’espère que cela vous fera gagner du temps.