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 "faite à la main" par celle-ci, mais je dois comprendre la partie "regex" de replaceAll
1) Qu'est-ce que "InCombiningDiacriticalMarks"?
2) Où en est la documentation? (et similaires?)
Merci.
Réponses:
\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}
, ce qui peut être plus clair pour le lecteur. Il est documenté ici dans UAX # 44: «La base de données de caractères Unicode» .Cela signifie que le point de code se trouve dans une plage particulière, un bloc, qui a été alloué pour être utilisé pour les choses portant 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 à l'extérieur de ce bloc ne sont pas essentiellement du même caractère.
Par exemple, il y a des lettres latines dans le
\p{Latin_1_Supplement}
bloc, 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 soupçonne que vous souhaiterez peut-être utiliser la propriété
\p{Mn}
, aka\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.C'est presque le même que pour vérifier
\p{Bidi_Class=Nonspacing_Mark}
, mais pas tout à fait, parce que ce groupe comprend aussi les marques de Enserrage\p{Me}
. Si vous voulez les deux, vous pouvez dire[\p{Mn}\p{Me}]
si vous utilisez un moteur d'expression régulière Java par défaut, car il ne donne accès qu'à la propriété General_Category.Vous devrez utiliser JNI pour accéder à la bibliothèque de regex ICU C ++ comme Google le fait pour accéder à quelque chose comme
\p{BC=NSM}
, car pour le moment, seuls ICU et Perl donnent accès à toutes les propriétés Unicode. La bibliothèque standard Java regex ne prend en charge que quelques propriétés Unicode standard. Dans JDK7 cependant, il y aura un support pour la propriété Unicode Script, 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 accéder à n'importe quel caractère du script latin. Cela conduit à la nécessité très courante[\p{Latin}\p{Common}\p{Inherited}]
.Sachez que cela ne supprimera pas ce que vous pourriez considérer comme des marques «accentuées» de tous les caractères! Il y en a beaucoup pour lesquels il ne le fera pas. Par exemple, vous ne pouvez pas convertir Đ en D ou ø en o de cette façon. Pour cela, vous devez réduire les points de code à ceux qui correspondent à la même force de classement principal dans la table de classement Unicode.
Un autre endroit où la
\p{Mn}
chose échoue est bien sûr de renfermer des marques comme\p{Me}
, évidemment, mais aussi il y a des\p{Diacritic}
caractères qui ne sont pas des marques. Malheureusement, vous avez besoin d'une prise en charge complète des propriétés pour cela, ce qui signifie que JNI est soit ICU, soit Perl. Java a beaucoup de problèmes avec le support Unicode, j'en ai peur.Oh attendez, je vois que vous êtes portugais. Vous ne devriez avoir aucun problème si vous ne traitez que du texte portugais.
Cependant, vous ne voulez pas vraiment supprimer les accents, je parie, mais vous voulez plutôt pouvoir faire correspondre les choses «sans accent», non? Si tel est le cas, vous pouvez le faire à l'aide de la classe d'assemblage ICU4J (ICU pour Java) . Si vous comparez à la force principale, les marques d'accentuation ne compteront pas. Je fais cela 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 ici si vous en avez besoin.
la source
Cela m'a pris du temps, mais je les ai tous pêchés:
Voici l'expression régulière qui devrait inclure tous les caractères zalgo, y compris ceux contournés dans la plage «normale».
J'espère que cela vous fera gagner du temps.
la source