Métodos de Búsqueda en Strings: Encontrar Texto en JavaScript

Los métodos de búsqueda en JavaScript son importantes porque nos ayudan a localizar textos dentro de un string o cadena de caracteres. Ya sea para validar la entrada de un usuario, encontrar una palabra clave o extraer datos de una URL, JavaScript nos ofrece un potente conjunto de métodos de búsqueda.

Comprender las diferencias y fortalezas de cada método es clave para escribir código que no solo funcione, sino que sea eficiente, legible y robusto. En esta guía exploraremos a fondo los cuatro métodos principales de búsqueda: includes()indexOf()lastIndexOf() y search().

Encuentra la Primera Aparición: indexOf()

El método indexOf nos permite buscar la posición de la primera aparición de un texto (subcadena) dentro de otra cadena. Este es un método simple pero poderoso y se utiliza comúnmente para realizar operaciones como búsqueda, validación y manipulación de texto.

Básicamente indexOf(): no permite hacer indicar: “¿Dónde está la primera vez que aparece?”

javascript
str.indexOf(searchValue, fromIndex)
  • searchValue: La subcadena que deseas buscar dentro de la cadena principal.
  • fromIndex (opcional): El índice desde donde quieres que comience la búsqueda. Si no se especifica, comienza desde el inicio de la cadena (índice 0).

El método indexOf() devuelve el índice de la primera aparición de searchValue en la cadena. En caso de encontrar el valor buscado, devuelve -1. y un dato a tener en cuenta es que es sensible a mayúsculas y minúsculas.

Búsqueda básica con indexOf:

javascript
const text = "Hola mundo";

console.log(text.indexOf("mundo")); // 5
console.log(text.indexOf("Hola"));  // 0
console.log(text.indexOf("hola"));  // -1 (sensible a mayúsculas)

Usando el segundo parámetro (fromIndex)

Podemos especificar desde donde queremos que el método empiece la búsqueda, para esto utilizamos el parámetro numérico que establece el índice específico.

javascript
const text = "Banana Banana";

console.log(text.indexOf("Banana"));       // 0
console.log(text.indexOf("Banana", 1));   // 7 (salta la primera "Banana")
console.log(text.indexOf("Banana", 8));   // -1 (no hay más "Banana" después del índice 8)

Validar si una subcadena existe

Un uso recurrente para este método es la verificación de un texto en un string, dado que indexOf devuelve -1 si no encuentra la subcadena, puedes usarlo para verificar si un texto esta presente dentro de esta.

Ejemplo Práctico: Extraer un nombre de usuario de un texto

javascript
const message = "El usuario @johndoe ha comentado.";
const atPosition = message.indexOf("@"); // 12

if (atPosition !== -1) {
    // Extraemos el texto a partir de la posición encontrada
    const username = message.slice(atPosition + 1, 20); // @johndoe -> johndoe
    console.log(`Nombre de usuario encontrado: ${username}`); // "johndoe"
} else {
    console.log("No se encontró ninguna mención de usuario.");
}

Buenas prácticas al usar indexOf

  1. Comprobar con -1: Asegúrate de manejar los casos donde no se encuentra la subcadena.
  2. Trabajar con cadenas normalizadas: Si estás buscando cadenas que pueden diferir en mayúsculas/minúsculas, normaliza antes de buscar.
  3. Usa fromIndex para optimizar búsquedas repetidas: Al buscar múltiples ocurrencias, establece un índice inicial para no buscar desde el principio cada vez.

Encuentra la Última Aparición: lastIndexOf()

lastIndexOf() es el hermano gemelo de indexOf(), pero en lugar de buscar de izquierda a derecha, busca de derecha a izquierda. Es perfecto para encontrar la última aparición de un carácter o subcadena.

Este método es útil cuando necesitas identificar la posición final de un texto o caracter dentro de un string, especialmente cuando este puede aparecer múltiples veces.

javascript
str.lastIndexOf(searchValue, fromIndex)
  • searchValue: La subcadena o carácter que deseas buscar dentro de la cadena principal.
  • fromIndex (opcional): El índice desde el cual comenzar la búsqueda, pero en este caso se realiza hacia atrás (de derecha a izquierda). Por defecto, es la longitud de la cadena menos 1 (el final de la cadena).

El método lastIndexOf() devuelve el índice de la última aparición de la subcadena especificada, si no encuentra la devuelve -1. Tambien es sensible a mayúsculas y minúsculas y comienza la búsqueda desde el final de la cadena (o desde el índice fromIndex especificado).

Búsqueda básica con lastIndexOf:

javascript
const text = "JavaScript es asombroso, y JavaScript es popular.";
console.log(text.lastIndexOf("JavaScript")); // 27 (última aparición)
console.log(text.lastIndexOf("es"));         // 38 (última aparición)
console.log(text.lastIndexOf("z"));          // -1 (no encontrado)

Usar el segundo parámetro (fromIndex)

Puedes especificar desde qué índice iniciar la búsqueda (hacia atrás):

javascript
const text = "JavaScript es genial. JavaScript es útil.";

console.log(text.lastIndexOf("JavaScript", 20)); // 0 (busca hacia atrás desde el índice 20)
console.log(text.lastIndexOf("JavaScript", 10)); // 0 (también encuentra la primera aparición)

Ejemplo Práctico: Obtener el nombre de un archivo de una ruta (URL)
Este es uno de los casos de uso más comunes. Quieres encontrar la última / para saber dónde empieza el nombre del archivo.

javascript
const filePath = "/users/home/documents/report.pdf";
const lastSlashIndex = filePath.lastIndexOf("/"); // 25

if (lastSlashIndex !== -1) {
    const fileName = filePath.slice(lastSlashIndex + 1);
    console.log(`El nombre del archivo es: ${fileName}`); // "report.pdf"
}

Consideraciones al usar lastIndexOf

  1. Búsqueda ineficiente en cadenas grandes: Al realizar búsquedas en cadenas extensas, especialmente desde un índice cercano al inicio puede ser más costoso que indexOf.
  2. No permite expresiones regulares: Si necesitas mayor flexibilidad para buscar patrones complejos, considera usar el método search con expresiones regulares.

Verifica si un Texto Está Presente: includes()

El método includes en JavaScript nos permite verificar si un string contiene una subcadena específica. A diferencia de otros métodos, includes no devuelve la posición de la coincidencia, sino un valor booleano (true o false). Este método es ideal para comprobaciones rápidas y limpias.

Básicamente includes(): es La Forma Más Simple de Preguntar “¿Está aquí?”

javascript
str.includes(searchString, position)
  • searchString: La subcadena que deseas buscar dentro de la cadena principal.
  • position (opcional): El índice desde el cual comenzar la búsqueda. Por defecto es 0 (inicio de la cadena).

El metodo includes() devuelve un valor booleano: true: Si la subcadena existe dentro de la cadena principal. false: Si la subcadena no existe. Tambien es sensible a mayúsculas y minúsculas y no devuelve la posición de la subcadena, solo indica si existe o no.

Ejemplo básico: Verificar la existencia de una subcadena:

javascript
const text = "JavaScript es increíble";

console.log(text.includes("JavaScript")); // true
console.log(text.includes("increíble"));  // true
console.log(text.includes("python"));     // false

Usar el segundo parámetro (position)

Puedes especificar un índice desde donde iniciar la búsqueda:

javascript
const text = "Hola mundo, bienvenido al mundo de JavaScript.";

console.log(text.includes("mundo"));           // true
console.log(text.includes("mundo", 10));        // true (busca desde el índice 10)
console.log(text.includes("bienvenido ", 25));  // false (después del índice 25 no hay "bienvenido")

Ejemplo Práctico: Validar un Correo Electrónico:
La forma más básica de validar un email es comprobar si contiene el símbolo @.

javascript
const email = "usuario@example.com";

if (email.includes("@")) {
    console.log("El formato del correo parece válido."); // Se ejecuta
} else {
    console.log("El correo no contiene un '@'.");
}

const text = "Hola mundo, bienvenido al mundo de JavaScript.";
console.log(text.includes("mundo", 10)); // true (empieza a buscar desde la posición 10)

Ventajas del método includes()

  1. Legible y directo: Es fácil de entender, ya que indica claramente si un texto incluye una subcadena.
  2. Más expresivo: Comparado con indexOf, no necesitas verificar si el resultado es diferente de -1.
  3. Útil para validaciones: Ideal para casos donde solo importa la presencia de una subcadena, no su posición.

Buscar con Expresiones Regulares: search()

El método search() se utiliza para buscar un patrón específico dentro de una cadena de texto. Este método es poderoso porque permite el uso de expresiones regulares para definir patrones de búsqueda, lo que lo hace más flexible que métodos como indexOf o includes.

javascript
str.search(regexp)
  • regexp: Puede ser un string literal o, más comúnmente, una expresión regular.

El método search() devuelve la posición del primer índice donde se encuentra una coincidencia con el patrón, si no encuentra ninguna coincidencia, devuelve -1. Funciona exclusivamente con patrones de búsqueda, lo que lo hace ideal para búsquedas avanzadas o casos donde indexOf no es suficiente.

Ejemplos básicos:

Buscar un texto literal con el método search()

javascript
const text = "JavaScript es asombroso.";

console.log(text.search("JavaScript")); // 0
console.log(text.search("es"));         // 11
console.log(text.search("Python"));     // -1 (no encontrado)

Usar expresiones regulares

javascript
const text = "JavaScript es divertido.";

console.log(text.search(/divertido/));  // 14 (coincide con "divertido")
console.log(text.search(/javascript/i)); // 0 (coincide con "JavaScript", sin distinguir mayúsculas/minúsculas)

Ejemplo Práctico: Validar un formato de contraseña
Supongamos que una contraseña debe contener al menos un número.

javascript
const password = "mySecurePassword123";
const weakPassword = "mysecurepassword";

// La expresión regular /\d/ busca cualquier dígito (0-9).
if (password.search(/\d/) !== -1) {
    console.log("La contraseña contiene al menos un número. ¡Bien!"); // Se ejecuta
} else {
    console.log("La contraseña debe contener al menos un número.");
}

if (weakPassword.search(/\d/) === -1) {
    console.log("La contraseña débil no cumple los requisitos."); // Se ejecuta
}

search() vs. indexOf(): Si solo buscas un string simple, indexOf() es ligeramente más rápido. Usa search() cuando necesites la potencia y flexibilidad de las expresiones regulares (como buscar “un número”, “una letra mayúscula” o un patrón de email).

Ventajas del método search()

  1. Soporte para expresiones regulares: Esto lo hace mucho más flexible y poderoso que métodos como indexOf.
  2. Intuitivo: Aunque permite expresiones regulares complejas, su uso básico es fácil de entender.
  3. Búsquedas avanzadas: Puedes usar modificadores como i (ignorar mayúsculas), g (global) o patrones complejos.

Algunas limitaciones al utilizar el método search()

  1. Devuelve solo el índice de la primera coincidencia: Si necesitas encontrar todas las coincidencias, es mejor usar el método match con una expresión regular global (/patrón/g).
  2. No proporciona un booleano: Si solo necesitas verificar la presencia de un patrón, includes es más apropiado.
  3. Requiere expresiones regulares para búsquedas avanzadas: Esto puede ser confuso para desarrolladores no familiarizados con las expresiones regulares.

Conclusión Métodos de Búsqueda:

Elegir el método de búsqueda correcto hace que tu código sea más eficiente y, sobre todo, más fácil de leer. Sigue esta guía simple:

  • Para una simple comprobación de sí/no: Usa includes().
  • Para encontrar la primera posición de un texto: Usa indexOf().
  • Para encontrar la última posición de un texto: Usa lastIndexOf().
  • Para buscar patrones complejos: Usa search() con expresiones regulares.

Al dominar estas cuatro herramientas, tendrás un control total sobre cómo encontrar y validar información dentro de tus cadenas de texto en JavaScript.

+1
0
+1
0