Localizar la palabra más larga en una cadena de texto en JavaScript

Publicado el 26 mayo 2021 por Daniel Rodríguez @analyticslane

En esta ocasión vamos a ver cómo se puede resolver un problema que a primera vista parece sencillo: localizar la palabra más larga en una cadena de texto. Para conseguir este objetivo va a ser necesario separar las palabras, ignorando los signos de puntuación, y medir la longitud de estas. Para lo que vamos a utilizar expresiones regulares en JavaScript.

Paso 1: eliminar los signos de puntuación

En primer lugar, es necesario eliminar los signos de puntuación de la cadena de texto. Lo que es necesario hacer antes de separar las palabras para evitar que se tengan en cuenta esos caracteres a la hora de medir la longitud de cada una de las palabras. Algo que se puede conseguir fácilmente mediante el uso de expresiones regulares. Aunque, en el caso de trabajar en lenguas romances, como es el caso del español, hay que tener en cuenta la posible existencia de acentos u otros símbolos que no existen en inglés en el texto, por lo que se tienen que usar una expresión regular que incluya los caracteres latinos. Así para eliminar los signos de puntuación se puede reemplazar estos por cadenas vacías con

text.replace(/[^a-zA-Z\u00C0-\u017F\s]/, "");

Paso 2: separar las palabras

Ahora ya se puede separar las palabras mediante el uso del método split() con el espacio como separador de palabras. Aunque, si fuese necesario contar correctamente el número de palabras y existiese dobles o triples espacios aparecerán varias cadenas varias. Problema que se puede resolver mediante el método filter(), seleccionando las cadenas que no están vacías. Así, se podría obtener las palabras simplemente con la siguiente línea.

text.split(" ").filter(t => t.length > 0);

En donde text es la cadena de texto ya sin signos de puntuación.

Paso 3: localizar la palabra o palabras más largas

Posiblemente una vez realizado el procesado anterior esta tarea sea la más fácil del proceso. Mediante un método reduce() se puede obtener la longitud de la palabra más larga de la lista.

const max = words.reduce((l, w) => Math.max(l, w.length), 0);

Valor que se puede usar posteriormente para seleccionar las palabras que sean repetidas.

words.filter(t => t.length == max)

Paso 4: Eliminar duplicados

Ahora puede ser necesario eliminar palabras duplicadas, en tal caso como se ha explicado anteriormente el método más rápido es usar Set

[...new Set(words)];

Creación de una función

Con todo lo visto se puede crear una función para obtener la palabra más larga de una cadena de tal como la que se muestra a continuación.

function getLargestWords(text) {
  const words = text.replace(/[^a-zA-Z\u00C0-\u017F\s]/, "")
    .split(" ").filter(i => i.length > 0);

  const max = words.reduce((l, w) => Math.max(l, w.length), 0);

  return [... new Set(words.filter(t => t.length == max))];
}

Conclusiones

En esta entrada hemos visto cómo se puede solucionar en JavaScript la búsqueda de la palabra más larga en una cadena de texto.

Imagen de Willi Heidelbach en Pixabay