94 votes

Java regex pour le support Unicode?

Pour faire correspondre A à Z, nous allons utiliser regex:

[A-Za-z]

Comment autoriser regex à correspondre aux caractères utf8 entrés par l'utilisateur? Par exemple, des mots chinois comme

139voto

stema Points 36113

Ce que vous cherchez sont propriétés Unicode.

par exemple, \p{L} de tous les type de lettre à partir de n'importe quelle langue

Si une expression régulière pour rechercher un tel mot Chinois pourrait être quelque chose comme

\p{L}+

Il ya beaucoup de ces propriétés, pour plus de détails, voir regular-expressions.info

Une autre option est d'utiliser le modificateur

Pattern.UNICODE_CHARACTER_CLASS

Dans Java 7, il y a une nouvelle propriété, Pattern.UNICODE_CHARACTER_CLASS qui permet à la version Unicode de la prédéfinis les classes de caractères, voir ma réponse ici pour plus de détails et des liens

Vous pourriez faire quelque chose comme ceci

Pattern p = Pattern.compile("\\w+", Pattern.UNICODE_CHARACTER_CLASS);

et \w correspondent à toutes les lettres et tous les chiffres de toutes les langues (et bien sûr certains mots en combinant des caractères comme" _).

9voto

Kilian Foth Points 8619

Pour correspondre à des caractères individuels, vous pouvez simplement inclure dans une classe de caractères, soit comme des littéraux ou par l'intermédiaire de l' \u03FB de la syntaxe.

Bien évidemment, on ne peut souvent pas la liste de tous les caractères autorisés dans les langues idéographiques. Pour faire de la regex traiter les caractères unicode en fonction de leur type ou de bloc de code, divers autres évasions sont pris en charge qui sont définis ici. Regardez la section "support de l'Unicode", en particulier les références à l' Character de la classe et le Standard Unicode lui-même.

4voto

McDowell Points 62645
  • l'expression régulière Java API travaille sur l' char type
  • l' char type est implicitement UTF-16
  • si vous avez des données UTF-8, vous aurez besoin de les transcoder en UTF-16 sur entrée si ce n'est pas déjà fait

Unicode est l'ensemble universel de caractères et de l'UTF-8 peut décrire tout cela (y compris les caractères de contrôle, de la ponctuation, des symboles, des lettres, etc.) Vous devrez être plus précis sur ce que vous voulez inclure et ce que vous souhaitez exclure. Java expressions régulières utilise l' \p{category} de la syntaxe pour correspondre à codepoints par catégorie. Voir le standard Unicode pour la liste de catégories.

Si vous souhaitez identifier et séparer les mots dans une séquence d'idéogrammes, vous aurez besoin de regarder plus sophistiqué de l'API. Je voudrais commencer par l' BreakIterator type.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X