web-dev-qa-db-fra.com

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

65
cometta

Ce que vous recherchez, ce sont des propriétés Unicode.

par exemple. \p{L} est toute sorte de lettre de n'importe quelle langue

Donc, une expression rationnelle pour correspondre à un mot chinois pourrait être quelque chose comme

\p{L}+

Il y a beaucoup de telles propriétés, pour plus de détails voir regular-expressions.info

Une autre option consiste à utiliser le modificateur

Pattern.UNICODE_CHARACTER_CLASS

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

Tu pourrais faire quelque chose comme ça

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

et \w correspondrait à toutes les lettres et tous les chiffres de toutes les langues (et bien sûr, certains mots combinant des caractères tels que _).

101
stema

Pour résoudre le problème du support NLS et éviter d'accepter les caractères spéciaux anglais, nous pouvons utiliser le modèle ci-dessous ...

[a-zA-Z0-9\u0080-\u9fff] * +

Pour la référence du point de code UTF: http://www.utf8-chartable.de/unicode-utf8-table.pl

Extrait de code:

    String vowels = "అఆఇఈఉఊఋఌఎఏఐఒఓఔౠౡ";
    String consonants = "కఖగఘఙచఛజఝఞటఠడఢణతథదధనపఫబభమయరఱలళవశషసహ";
    String signsAndPunctuations = "కఁకంకఃకాకికీకుకూకృకౄకెకేకైకొకోకౌక్కౕకౖ";
    String symbolsAndNumerals = "౦౧౨౩౪౫౬౭౮౯";
    String engChinesStr = "ABC導字會";


    Pattern ALPHANUMERIC_AND_SPACE_PATTERN_TELUGU = Pattern
            .compile("[a-zA-Z0-9 \\u0c00-\\u0c7f]*+");
    System.out.println(ALPHANUMERIC_AND_SPACE_PATTERN_TELUGU.matcher(vowels)
            .matches());


    Pattern ALPHANUMERIC_AND_SPACE_PATTERN_CHINESE = Pattern
            .compile("[a-zA-Z0-9 \\u4e00-\\u9fff]*+");

    Pattern ENGLISH_ALPHANUMERIC_SPACE_AND_NLS_PATTERN = Pattern
            .compile("[a-zA-Z0-9 \\u0080-\\u9fff]*+");

    System.out.println(ENGLISH_ALPHANUMERIC_SPACE_AND_NLS_PATTERN.matcher(engChinesStr)
            .matches());
9
Venkateswara Rao

Pour faire correspondre des caractères individuels, vous pouvez simplement les inclure dans une classe de caractères, en tant que littéraux ou via le \u03FB syntaxe.

Évidemment, vous ne pouvez souvent pas énumérer tous les caractères autorisés dans les langues idéographiques. Pour que l'expression rationnelle traite les caractères unicode en fonction de leur type ou de leur bloc de code, plusieurs autres échappements définis sont définis ici . Regardez la section "Support Unicode", en particulier les références à la classe Character et à la norme Unicode elle-même.

7
Kilian Foth
  • l'API d'expression régulière Java fonctionne sur le type char
  • le type char est implicitement UTF-16
  • si vous avez des données UTF-8, vous devrez les convertir en UTF-16 en entrée si cela n’est pas déjà fait.

Unicode est le jeu universel de caractères et UTF-8 peut tout décrire (y compris les caractères de contrôle, la ponctuation, les symboles, les lettres, etc.). Vous devrez être plus précis sur ce que vous souhaitez inclure et ce que vous souhaitez exclure. Java) Les expressions rationnelles utilisent le \p{category} syntaxe pour faire correspondre les points de code par catégorie . Voir le norme Unicode pour la liste des catégories.

Si vous souhaitez identifier et séparer des mots dans une séquence d'idéographes, vous devez utiliser une API plus sophistiquée. Je commencerais par le type BreakIterator .

3
McDowell