• No se han encontrado resultados

Ignore las diferencias entre mayúsculas y minúsculas cuando busque o reemplace subcadenas

In document Java soluciones de programación (página 43-46)

Componentes clave

Clases Métodos

Java.lang.String boolean matches(String expReg)

el requisito de que se busque "esta" como una palabra separada. Para encontrar sólo palabras completas, usaría esta expresión: \b(?i)esta\b.

Una vez que haya defi nido el patrón insensible a las diferencias entre mayúsculas y

minúsculas, puede llamar a matches( ) para determinar si alguna secuencia de caracteres coincide con ese patrón. Aquí se muestra su forma general:

boolean marches( )String expReg)

Devuelve verdadero si se encuentra una secuencia que coincide con expReg en la cadena que se invoca y falso, de lo contrario. Por ejemplo, esta llamada a matches( ) devuelve verdadero: "Las aguas son profundas".matches("(?i)las.* ");

Debido a que la literal "las" está antecedida por (?i), coincidirá con "Las" en la cadena que se invoca. Las diferencias entre mayúsculas y minúsculas se ignoran. Sin el uso de (?i), la búsqueda fallaría debido a las diferencias entre "las" y "Las". El método matches( ) lanzará una excepción PatternSyntaxException si expReg no es válida.

Puede reemplazar todas las apariciones de una subcadena con otra al llamar a replaceAll( ). Aquí se muestra su forma general:

String replaceAll(String expReg, String, cadReem)

Devuelve una nueva cadena en que todas las apariciones del patrón especifi cado por expReg en la cadena que se invoca se han reemplazado con cadReem. Si especifi ca la marca para ignorar diferencias entre mayúsculas y minúsculas cuando se construye la expReg, entonces se ignorarán esas diferencias. Por ejemplo, suponga que cad contiene la siguiente cadena (nótese que obviamos la inclusión de escapes para los caracteres con acento):

¿Qué día es hoy? ¿Es viernes?

Entonces la siguiente llamada reemplaza todas las apariciones de "es" con "fue": cad.replaceAll("(?i)es", "fue");

La cadena resultante es:

¿Qué día fue hoy? ¿Fue viernes?

El método replaceAll( ) también lanzará una PatternSyntaxException si expReg no es válida.

Ejemplo

En el siguiente ejemplo se muestra cómo buscar y reemplazar de una manera que no sea sensible a las diferencias entre mayúsculas y minúsculas:

// Ignora las diferencias entre mayúsculas y minúsculas cuando se // buscan subcadenas para reemplazo.

class DemoIgnMayMin {

public static void main(String args[ ]) { String cad = "Se trata de una PRUEBA.";

System.out.println("Ignora may\u00a3sculas y min\u00a3sculas al buscar.\n" + "Buscando ‘prueba’ en: " + cad);

// Usa matches( ) para encontrar cualquier versión de prueba. if(cad.matches("(?i).*prueba.*"))

System.out.println("prueba se encuentra en la cadena."); System.out.println( );

cad = "alfa beta, Alfa beta, alFa beta, ALFA beta";

// Usa replaceAll( ) para ignorar las diferencias entre mayúsculas // y minúsculas cuando se reemplaza una subcadena con otra.

// En este ejemplo, se reemplazan todas las versiones de alfa con zeta. System.out.println("Ignora may\u00a3sculas y min\u00a3sculas al reemplazar.\n" +

"Reemplaza cualquier versi\u00a2n de ‘alfa’ " + "con ‘zeta’ en:\n" + " " + cad);

String resultado = cad.replaceAll("(?i)alfa", "zeta"); System.out.println("Luego del reemplazo:\n" +

" " + resultado); }

}

Aquí se muestra la salida:

Ignora mayúsculas y minúsculas al buscar. Buscando ‘prueba’ en: Se trata de una PRUEBA. prueba se encuentra en la cadena.

Ignora mayúsculas y minúsculas al reemplazar.

Reemplaza cualquier versión de ‘alfa’ con ‘zeta’ en: alfa beta, Alfa beta, alFa beta, ALFA beta

Luego del reemplazo:

zeta beta, zeta beta, zeta beta, zeta beta

Como un punto de interés hay que señalar que, debido a que las expresiones regulares se encuentran dentro del código de este ejemplo y se sabe que son válidas sintácticamente, no hay necesidad de capturar una PatternSyntaxException, porque no ocurrirá ninguna excepción. (Es el mismo caso de otros varios ejemplos de este capítulo). Sin embargo, en su propio código, tal vez necesite manejar este posible error. Esto resulta especialmente cierto si las expresiones regulares se construyen en tiempo de ejecución, como sucede a partir de la entrada del usuario.

Opciones

Aunque matches( ) ofrece el poder y la elegancia de usar una expresión regular, no es la única manera de buscar una cadena de manera insensible a las diferencias entre mayúsculas y

minúsculas. En algunas situaciones tal vez pueda usar esta versión del método regionMatches( ): boolean regionMatches(boolean ignMayMin, int inicio,

String cad2, int inicio2, int numCars)

Si ignMayMin es verdadero, entonces la búsqueda ignora las diferencias entre mayúsculas y minúsculas. El punto inicial de la búsqueda en la cadena que se invoca se especifi ca con inicio. El punto de partida de la búsqueda en la segunda cadena se pasa en inicio2, la segunda cadena se especifi ca con cad2 y el número de caracteres para comparar se especifi ca con numCars. Por supuesto, regionMatches( ) sólo compara las partes especifi cadas de las dos cadenas, pero eso bastará para algunas necesidades.

Otra manera de ignorar las diferencias entre mayúsculas y minúsculas cuando se busca una subcadena consiste en convertir primero ambas cadenas a minúsculas (o mayúsculas, según lo elija). Luego, llame a contains( ) para determinar si la cadena contiene la subcadena. En general, este método es menos atractivo que usar un patrón insensible a las diferencias entre mayúsculas y minúsculas con matches( ). Sin embargo, podría ser una buena elección si tiene otra razón para convertir las cadenas a sólo mayúsculas o sólo minúsculas. Por ejemplo, si la cadena que se buscará contiene una serie de comandos de base de datos, entonces normalizar las cadenas podría simplifi car otras partes de su programa.

Si sólo quiere reemplazar la primera aparición de un patrón, use replaceFirst( ) en lugar de replaceAll( ). Aquí se muestra cómo:

String replaceFirst(String expReg, String cadReem)

La primera secuencia en la cadena que se invoca y que coincida con regExp se reemplazará con cadReem. Se lanzará una PatternSyntaxException si expReg no es válida.

También es posible usar la API de expresiones regulares de Java para realizar una búsqueda y reemplazo que no sea sensible a las diferencias entre mayúsculas y minúsculas.

In document Java soluciones de programación (página 43-46)