2009-12-16 27 views
9

Saludos,¿Comprobar cadena si contiene solo caracteres latinos?

estoy desarrollando aplicaciones GWT donde el usuario puede introducir sus datos en japonés. Pero el 'userid' y la 'contraseña' solo deben contener caracteres en inglés (alfabeto latino). ¿Cómo validar cadenas para esto?

+1

Hay caracteres ingleses?!?! Pensé que los caracteres en el idioma inglés son del alfabeto latino. –

+0

bien si se refiere a los personajes ascii, entonces yo llamaría a esos caracteres ingleses ... o americanos. –

Respuesta

26

Puede usar String#matches() con un bit regex para esto. Los caracteres latinos están cubiertos por \w.

lo que este debe hacer:

boolean valid = input.matches("\\w+"); 

Esto por cierto también cubre los números y el guión bajo _. No estoy seguro si eso perjudica. De lo contrario, simplemente puede usar [A-Za-z]+.

Si también desea cubrir diacritical characters (ä, é, ò, etc., por definición también caracteres latinos), debe normalizar primero y eliminar las marcas diacríticas antes de hacer coincidir, simplemente porque no hay (documentado) regex que cubra diacríticos.

String clean = Normalizer.normalize(input, Form.NFD).replaceAll("\\p{InCombiningDiacriticalMarks}+", ""); 
boolean valid = clean.matches("\\w+"); 

actualización: hay una expresión regular indocumentado en Java que cubre diacríticos, así, la \p{L}.

boolean valid = input.matches("\\p{L}+"); 

Above funciona en Java 1.6.

+2

'\ p {L}' está documentado: http://java.sun.com/javase/6/docs/api/java/util/regex/Pattern.html#ubc –

+1

Drat, tienes razón. Juraría que nunca lo había visto antes en los documentos API durante años. ¿Eres el mantenedor de los documentos de Sun API? – BalusC

+1

No, pero he leído esa página de JavaDoc en particular con más frecuencia de lo que me gustaría admitir ;-) –

2

Puede haber un mejor enfoque, pero puede cargar una colección con lo que considere que son caracteres aceptables, y luego verificar cada carácter en el campo nombre de usuario/contraseña en contra de esa colección.

Pseudo:


foreach (character in username) 
{ 
    if !allowedCharacters.contains(character) 
    { 
     throw exception 
    } 
} 
2

Para algo tan simple, que haría uso de una expresión regular.

private static final Pattern p = Pattern.compile("\\p{Alpha}+"); 

static boolean isValid(String input) { 
    Matcher m = p.matcher(input); 
    return m.matches(); 
} 

Hay otras clases predefinidas como \w que podrían funcionar mejor.

6
public static boolean isValidISOLatin1(String s) { return Charset.forName("US-ASCII").newEncoder().canEncode(s); } // or "ISO-8859-1" for ISO Latin 1 

Como referencia, ver el documentation.

+0

No utilizaría esto, ya que permite que la entrada contenga espacios en blanco y caracteres de control (incluido U + 0000), que casi con certeza no son bienvenidos en un nombre de usuario. –

+2

Olvidó llamar a 'newEncoder()' en el juego de caracteres. – Tvaroh

+0

Agregó una llamada a newEncoder –

0

he usado con éxito una combinación de las respuestas de user232624, Joachim Sauer y Tvaroh:

static CharsetEncoder asciiEncoder = Charset.forName("US-ASCII"); // or "ISO-8859-1" for ISO Latin 1 

boolean isValid(String input) {  
    return Character.isLetter(ch) && asciiEncoder.canEncode(username); 
} 
0

No es mi solución y se está trabajando excelente

public static boolean isStringContainsLatinCharactersOnly(final String iStringToCheck) 
{ 
    return iStringToCheck.matches("^[a-zA-Z0-9.]+$"); 
} 
Cuestiones relacionadas