Java: métodos incorporados de expresión regular de cadena (RegEx)

En esta breve guía, nos sumergiremos en los métodos String RegEx incorporados en Java para evitar el modelo estándar de las clases Pattern y Matcher del paquete regex.

Las Expresiones Regulares (RegEx) son una herramienta poderosa y nos ayudan a igualar patrones de manera flexible, dinámica y eficiente, así como a realizar operaciones en base a los resultados.

En esta breve guía, echaremos un vistazo a los métodos RegEx incorporados, que son parte de la clase String y nos permiten evitar la molestia de trabajar con las clases Pattern y Matcher.

If you'd like to read more about Regular Expressions and the regex package, read out Guía de expresiones regulares en Java!

Métodos RegEx de cadenas en Java

El paquete regex en la API estándar de Java nos ha presentado las clases Pattern y Matcher que podemos usar para representar expresiones regulares y buscar coincidencias. Sin embargo, esto requiere la creación y el uso de dos objetos adicionales, que, aunque funciona bien, es un poco detallado e innecesario.

Era muy necesaria una solución más limpia y elegante por parte del cliente, para una coincidencia simple, y la clase String estaba imbuida de algunos métodos relacionados con las expresiones regulares.

¿Qué sucede debajo del capó?

Bueno, exactamente como podría haberlo imaginado: los métodos finalmente llaman a las clases desde el módulo regex, y usar los métodos String RegEx es técnicamente lo mismo que usar las clases en sí, solo que más limpio y menos detallado.

{.icon aria-hidden=“true”}

Nota: En la mayoría de los casos, preferirá usar los métodos integrados, por este motivo.

If you'd like to read more about Regular Expressions and the regex package, read out Guía de expresiones regulares en Java!

El método matches()

El método matches() funciona de la misma manera que el método matches() del objeto Matcher, devuelto desde un objeto Pattern, dado un cierto RegEx. Esto se debe a que inherentemente llama a estos métodos exactos.

Acepta una expresión regular representada por una cadena y devuelve un booleano en función de si la totalidad de la cadena coincide con el RegEx; tenga en cuenta que la cadena toda tiene que coincidir, de lo contrario, se devuelve falso:

1
2
3
4
5
6
String string = "Hello there!";
boolean matches = string.matches(".*Hello.*");

if (matches) {
    System.out.println("General Kenobi.");
}

{.icon aria-hidden=“true”}

Nota: El método matches(), sorprendentemente, no admite la adición de enumeraciones Pattern, como CASE_INSENSITIVE y en realidad es CASE_SENSITIVE por defecto. Para estos, tendrá que usar la clase fuente en sí.

Nuestro RegEx busca la secuencia "Hello" con cualquier cantidad de caracteres antes y después, por lo que, naturalmente, coincide y el resultado es:

1
General Kenobi.

Para aquellos interesados, el método matches() se ve así:

1
2
3
public boolean matches(String regex) {
    return Pattern.matches(regex, this);
}

Que solo llama:

1
2
3
4
5
public static boolean matches(String regex, CharSequence input) {
    Pattern p = Pattern.compile(regex);
    Matcher m = p.matcher(input);
    return m.matches();
}

Dicho esto, el método distingue entre mayúsculas y minúsculas de forma predeterminada.

El método split()

El método split() es un método comúnmente utilizado. Muchos están familiarizados con el método al que se les dice que divide la cadena en función del carácter/delimitador dado, sin embargo, esto no es del todo exacto.

El método split() divide la cadena dada, en cada ocurrencia de la Expresión Regular dada.

Si su RegEx es un solo carácter, se dividirá en instancias de ese carácter; sin embargo, no está limitado a caracteres individuales. Puede dividir la cadena en cualquier RegEx:

El caso de uso más común es dividir una cadena de entrada, en formato CSV:

1
2
3
4
5
6
String countries = "England,Japan,Italy,Kenya,Mexico";
String[] splits = countries.split(",");

for (String country: splits){
    System.out.println(country);
}

Esto resulta en:

1
2
3
4
5
England
Japan
Italy
Kenya
Mexico

Además, las oraciones a menudo se dividen en palabras dividiéndolas en cada " " (espacio en blanco)`. Debido a esto, la comprensión común del método es que se divide en un cierto carácter, pero aquí existe la posibilidad de ser creativo.

Los métodos replaceFirst() y replaceAll()

La clase Matcher no solo coincide, sino que se puede usar para reemplazar ciertas partes de cadenas, que se encuentran a través de expresiones regulares.

Con ese fin, puede usar los métodos abreviados replaceFirst() y replaceAll() de la clase String, que llama al Matcher (que a su vez llama a los métodos String...) para modificar una cadena. , en la primera (o en todas) ocurrencias de una secuencia dada se hace coincidir.

Ambos métodos aceptan RegEx y una cadena de reemplazo: replaceFirst() reemplaza la primera aparición de esa secuencia de caracteres con la cadena de reemplazo, mientras que el método replaceAll() reemplaza todas las ocurrencias:

1
2
3
4
5
6
7
String string = "Python is a general-purpose programming language. With Python, you can opt to create...";

string = string.replaceAll("Python", "Jaffa");
System.out.println(string);

string = string.replaceFirst("Jaffa", "Java");
System.out.println(string);

Ambos métodos devuelven un nuevo objeto String, así que asegúrese de asignarlo a una nueva variable de referencia, o la misma que ya tiene por ahí. En la primera llamada println(), tendremos ambas secuencias "Python" convertidas en "Jaffa", y en la segunda llamada println(), habremos convertido la primera "Jaffa" en "Java":

1
2
Jaffa is a general-purpose programming language. With Jaffa, you can opt to create...
Java is a general-purpose programming language. With Jaffa, you can opt to create...

Conclusión

En esta breve guía, hemos echado un vistazo a los métodos RegEx integrados de la clase String en Java.

Para lidiar con las expresiones regulares, podemos usar las clases Pattern y Matcher del paquete regex; sin embargo, para muchos casos de uso diario con cadenas, puede evitar el repetitivo usando el código incorporado. en métodos.

Estos métodos finalmente usan el paquete regex, por lo que se espera el mismo nivel de rendimiento y resultados.

Licensed under CC BY-NC-SA 4.0