2009-03-24 19 views
25

Sé que hay muchos métodos upper() en Java y otros frameworks como Apache commons lang, que convierten un String en mayúsculas.¿Existe un método de biblioteca existente que compruebe si una cadena es mayúscula o minúscula en Java?

¿Hay alguna biblioteca común que proporcione un método como isUpper(String s) y isLower(String s), para comprobar si todos los caracteres en la cadena son mayúsculas o minúsculas?

EDIT:

Muchas buenas respuestas acerca de la conversión de Alto y comparando con esto. Creo que debería haber sido un poco más específico, y dije que ya había pensado en eso, pero esperaba poder usar un método existente para esto.

Buen comentario sobre la posible inclusión de esto en apache.commons.lang.StringUtils. Alguien ha enviado un parche (20090310). Con suerte, veremos esto pronto. https://issues.apache.org/jira/browse/LANG-471

EDIT:

Lo que necesitaba este método para, era capitalizar nombres de hoteles que a veces venían en mayúsculas. Solo quería capitalizarlos si fueran mayúsculas o minúsculas. me he corrido en que los problemas con caracteres no carta mencionados en algunos de los puestos, y terminé haciendo algo como esto:

private static boolean isAllUpper(String s) { 
    for(char c : s.toCharArray()) { 
     if(Character.isLetter(c) && Character.isLowerCase(c)) { 
      return false; 
     } 
    } 
    return true; 
} 

Esta discusión y soluciones diferentes (con diferentes problemas), muestra claramente que existe una necesidad de un buen método sólido es AllUpper (String s) en commons.lang

Hasta entonces supongo que el myString.toUpperCase().equals(myString) es la mejor manera de hacerlo.

+1

echar un vistazo @ https://issues.apache.org/jira/browse/LANG-471 a seguir si va a ser añadido en un solo día apache commons – chburd

Respuesta

5

de guayaba CharMatchers tienden a ofrecer soluciones muy expresivos y eficientes a este tipo de problema.

CharMatcher.javaUpperCase().matchesAllOf("AAA"); // true 
CharMatcher.javaUpperCase().matchesAllOf("A SENTENCE"); // false 
CharMatcher.javaUpperCase().or(CharMatcher.whitespace()).matchesAllOf("A SENTENCE"); // true 
CharMatcher.javaUpperCase().or(CharMatcher.javaLetter().negate()).matchesAllOf("A SENTENCE"); // true 
CharMatcher.javaLowerCase().matchesNoneOf("A SENTENCE"); // true 

Un importación estática para com.google.common.base.CharMatcher.* puede ayudar a hacer estos más sucinta.

javaLowerCase().matchesNoneOf("A SENTENCE"); // true 
7

No es que yo sepa.

Puede copiar la cadena y convertir la copia a mayúscula/minúscula y compararla con la original.

O cree un bucle que verifique los caracteres individuales si se trata de mayúsculas o minúsculas.

5

Este método puede ser más rápido que la comparación de una cadena en su versión en mayúsculas, ya que requiere sólo 1 paso:

public static boolean isUpper(String s) 
{ 
    for(char c : s.toCharArray()) 
    { 
     if(! Character.isUpperCase(c)) 
      return false; 
    } 

    return true; 
} 

Tenga en cuenta que puede haber algunos problemas de localización con diferentes juegos de caracteres. No tengo ninguna experiencia de primera mano, pero creo que hay algunos idiomas (como el turco) donde las letras minúsculas diferentes se pueden asignar a la misma letra mayúscula.

+0

Tenga en cuenta que toCharArray() creará una copia de la cuerda. Sugiero usar el viejo chatAt() en su lugar. –

+0

En mayúsculas y minúsculas en turco son como de costumbre, es solo que la asignación es diferente de cualquier otra configuración regional. Específicamente si "i" tiene un diéresis conmuta al cambiar de caja. El eszet alemán se transforma en dos caracteres cuando está en mayúscula. –

+1

Si la cadena contiene caracteres que no son letras (como "2"), este método no es muy útil. Probablemente no funcione muy bien con letras de alfabetos que no tienen mayúsculas/minúsculas o caracteres de rango suplementarios (puntos de código de 32 bits). – McDowell

0

Puede usar java.lang.Character.isUpperCase() Luego puede escribir fácilmente un método que verifique si su cadena está en mayúscula (con un simple bucle).

Enviar el mensaje aUpperCase() a su cadena y luego comprobar si el resultado es igual a su cadena será probablemente más lenta.

+0

Esto requiere más elaboración. Un uso descuidado de 'isUpperCase' dará como resultado implementaciones defectuosas. Ver las otras respuestas (y sus trampas). –

14

Desafortunadamente no es una función de biblioteca, pero es bastante fácil de hacer la suya propia. Si la eficiencia es una preocupación, esto podría ser más rápido que en el caso de UpperCase(). Equals (s) porque puede rescatar temprano.

public static boolean isUpperCase(String s) 
{ 
    for (int i=0; i<s.length(); i++) 
    { 
     if (!Character.isUpperCase(s.charAt(i))) 
     { 
      return false; 
     } 
    } 
    return true; 
} 

Editar: Como han señalado otros carteles y comentaristas, debemos tener en cuenta el comportamiento cuando la cadena contiene caracteres que no sean letras: debe isUpperCase ("hello1") devuelven verdadero o falso? La función anterior devolverá falso porque '1' no es un carácter en mayúscula, pero posiblemente este no sea el comportamiento que desea. Una definición alternativa que devolvería verdadera en este caso sería:

public static boolean isUpperCase2(String s) 
{ 
    for (int i=0; i<s.length(); i++) 
    { 
     if (Character.isLowerCase(s.charAt(i))) 
     { 
      return false; 
     } 
    } 
    return true; 
} 
+0

+1 para no asignar objetos –

+0

gran pequeña función, ¡me encanta! – Nicholas

+0

+1 'isUpperCase2' debe ser la respuesta aceptada. La respuesta actual de 'StringUtils.isAllUpperCase' falla para oraciones en lenguaje natural obviamente mayúsculas como" NO FUNCIONARÁ ", porque' '' no es un carácter en mayúscula. –

2

Pruebe esto, puede ayudar.

import java.util.regex.Pattern; 

private static final String regex ="^[A-Z0-9]"; //alpha-numeric uppercase 
public static boolean isUpperCase(String str){ 
    return Pattern.compile(regex).matcher(str).find(); 
} 

con este código, solo cambiamos la expresión regular.

+2

private static final Cadena VALID_CODE = "^ [A-Z0-9] + $"; – TimP

+1

La expresión regular dada solo verifica el inicio de la cadena. – TimP

+0

Simplemente 'str.matches (" [A-Z0-9] + ")' sería más corto y más fácil de leer. Y dado que 'String # matches' agrega implícitamente'^... & 'para hacer coincidir toda la cadena, tampoco necesitará la expresión completa'^[A-Z0-9] + $ 'sugerida por @TimP (que necesita su código actual, ya que solo está comprobando si una Cadena está comenzando con una letra mayúscula, en lugar de estar completamente en mayúscula). –

15

Ahora en StringUtils isAllUpperCase

+1

"NO FUNCIONA PARA ESTE STRING", y adivina por qué :) –

+1

Funciona perfectamente según su documentación; hay un ejemplo dado: StringUtils.isAllUpperCase ("") = falso – gerardw

+1

No tiene errores, si eso es lo que quiere decir. Es solo que es muy poco probable que sea útil en el procesamiento del lenguaje natural. También es fácil de arreglar (ver la respuesta de [Simon] (http://stackoverflow.com/a/677592/147346)). –

5

Esta condición, si se puede obtener el resultado esperado:

String input = "ANYINPUT"; 

if(input.equals(input.toUpperCase()) 
{ 
    // input is all upper case 
} 
else if (input.equals(input.toLowerCase()) 
{ 
    // input is all lower case 
} 
else 
{ 
    // input is mixed case 
} 
+0

Esto no maneja ninguna cadena posible. En cambio, esto solo maneja un subconjunto conocido de cadenas y supondría que OP quería algo que funcionase para cualquier cadena –

+2

@ sigmavirus24 ¿Qué caso no maneja? –

Cuestiones relacionadas