2016-02-09 2 views
2

J'ai la méthode suivante pour vérifier que cette chaîne contient uniquement des symboles latins.Vérifier que la chaîne contient des lettres non latines

private boolean containsNonLatin(String val) { 
     return val.matches("\\w+"); 
} 

Mais il retourne faux si je passe la chaîne: my string car il contient l'espace. Mais j'ai besoin de la méthode qui va vérifier que si la chaîne contient des lettres qui ne sont pas en alphabet latin, elle devrait retourner false et elle devrait retourner vrai dans tous les autres cas.

S'il vous plaît, aidez-moi à améliorer ma méthode.

exemples de chaînes valides:

w123. 
w, 12 
w#123 
dsf%&@ 
+0

Si vous devez faire correspondre uniquement des lettres ASCII et un espace, utilisez 'retour val.matches (" [ \\ p {Alpha}] + ");' –

+0

@Wiktor Stribiżew Je ne dois retourner le faux que si je vois des symboles d'autres alpabets. Chinois par exemple – gstackoverflow

+0

'" [\\ p {Alpha}] + "' n'autorise pas le chinois, seulement les lettres ASCII et un espace régulier (valeur de 32 déc.). Vous pouvez également utiliser '[\\ p {L} \\ p {M} && [^ \\ p {Alpha}]] +' pour faire correspondre une ou plusieurs lettres quelconques sauf ASCII. –

Répondre

1

je besoin de quelque chose ne p{IsLatin}

Si vous devez faire correspondre toutes les lettres, mais des lettres ASCII latins, vous pouvez utiliser

"[\\p{L}\\p{M}&&[^\\p{Alpha}]]+" 

Le \p{Alpha} La classe POSIX correspond à [A-Za-z]. Le \p{L} correspond à n'importe quelle lettre de base Unicode, \p{M} correspond à des signes diacritiques. Lorsque nous ajoutons &&[^\p{Alpha}], nous soustrayons ces [A-Za-z] de toutes les lettres Unicode. L'expression entière correspond à une ou plusieurs lettres Unicode autres que les lettres ASCII.

Pour ajouter un espace, il suffit d'ajouter \s:

"[\\s\\p{L}\\p{M}&&[^\\p{Alpha}]]+" 

Voir IDEONE demo:

List<String> strs = Arrays.asList("w123.", "w, 12", "w#123", "dsf%&@", "Двв"); 
for (String str : strs) 
    System.out.println(!str.matches("[\\s\\p{L}\\p{M}&&[^\\p{Alpha}]]+")); // => 4 true, 1 false 
+0

Veuillez vérifier cette approche. Cette expression recherchera exactement n'importe quelle lettre Unicode * non en alphabet latin. –

4

Vous pouvez utiliser \p{IsLatin} classe:

return !(var.matches("[\\p{Punct}\\p{Space}\\p{IsLatin}]+$")); 

Java Regex Reference

+0

il devrait fonctionner non seulement pour l'espace. . & $% etc – gstackoverflow

+0

J'ai besoin de quelque chose comme non p {IsLatin} – gstackoverflow

+0

Vous pouvez utiliser 'return! (var.matches (" [\\ p {Espace} \\ p {IsLatin}] + $ "))' inverser le résultat. – anubhava

1

il suffit d'ajouter un espace à votre matcher:

private boolean isLatin(String val) { 
    return val.matches("[ \\w]+"); 
} 
0

utilisateur ceci:

public static boolean isNoAlphaNumeric(String s) { 
     return s.matches("[\\p{L}\\s]+"); 
} 
  • \p{L} toute lettre Unicode.
  • \s caractère espace