remove accent java




Regex: qu'est-ce que InCombiningDiacriticalMarks? (2)

Ça m'a pris un moment, mais je les ai tous pêchés:

Voici regex qui devrait inclure tous les caractères de zalgo, y compris ceux qui ont été ignorés dans la gamme '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 fait gagner du temps.

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

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

J'ai remplacé ma méthode "hand made" par celle-ci, mais j'ai besoin de comprendre la partie "regex" de replaceAll

1) Qu'est-ce que "InCombiningDiacriticalMarks"?
2) Où est la documentation? (et similaires?)

Merci.


\p{InCombiningDiacriticalMarks} est une propriété de bloc Unicode. En JDK7, vous serez capable de 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 base de données de caractères Unicode" .

Ce que cela signifie, c'est que le point de code se situe dans une plage particulière, un bloc, qui a été affecté à l'utilisation des choses par ce nom. C'est une mauvaise approche, car il n'y a aucune garantie que le point de 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 essentiellement le même caractère.

Par exemple, il existe des lettres latines dans le bloc \p{Latin_1_Supplement} , comme é, U + 00E9. Cependant, il y a des choses qui ne sont pas des lettres latines là aussi. 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 suppose que vous pouvez utiliser la propriété \p{Mn} , alias \p{Nonspacing_Mark} . Tous les points de code dans le bloc Combining_Diacriticals sont de ce type. Il y a aussi (à partir de Unicode 6.0.0) 1087 Marqons Non Spores qui ne sont pas dans ce bloc.

C'est presque la même chose que de 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 d'expressions rationnelles Java par défaut, car il donne seulement accès à la propriété General_Category.

Vous devez utiliser JNI pour accéder à la bibliothèque ICU C ++ regex de la même manière que Google pour accéder à quelque chose comme \p{BC=NSM} , car pour le moment, seules les unités ICU et Perl donnent accès à toutes les propriétés Unicode. La bibliothèque d'expressions régulières Java ne prend en charge que quelques propriétés Unicode standard. Dans JDK7, la propriété de script Unicode sera prise en charge, ce qui est à peu près infiniment préférable à la propriété Block. Ainsi vous pouvez dans JDK7 écrire \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 [\p{Latin}\p{Common}\p{Inherited}] .

Sachez que cela ne supprimera pas ce que vous pourriez considérer comme des marques «d'accent» de tous les personnages! Il y en a beaucoup qui ne le feront pas. Par exemple, vous ne pouvez pas convertir Đ en D ou ø à o de cette façon. 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 d'entourer 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 de la prise en charge complète de la propriété pour cela, ce qui signifie JNI pour ICU ou Perl. Java a beaucoup de problèmes avec le support Unicode, j'en ai peur.

Oh, attends, je vois que tu es portugais. Vous ne devriez pas avoir de problèmes du tout alors si vous avez seulement du texte en portugais.

Cependant, vous ne voulez pas vraiment enlever les accents, je parie, mais plutôt vous voulez être en mesure de faire correspondre les choses "insensiblement", non? Si c'est le cas, vous pouvez le faire en utilisant la classe de collecteur ICU4J (ICU for Java) . Si vous comparez à la force primaire, les marques d'accent ne compteront pas. Je fais cela tout le temps parce que je traite souvent du texte en espagnol. J'ai un exemple de la façon de faire ça pour les Espagnols assis quelque part si vous en avez besoin.





unicode