Saltar a contenido

3.0 Cadenas de texto

Una cadena es una secuencia de caracteres: un nombre, una frase, el contenido de un archivo. Casi todo programa las maneja, y casi siempre se hace lo mismo: recorrerlas, buscar dentro, partirlas y transformarlas.

En Dart el texto es un String. Las cadenas son inmutables: ningún método modifica la original, todos devuelven una nueva.

Recorrer y buscar

void main() {
  final texto = 'banana';
  print('longitud: ${texto.length}');
  print('primera: ${texto[0]}, última: ${texto[texto.length - 1]}');
  print('subcadena: ${texto.substring(2, 5)}');

  var cuenta = 0;
  for (var i = 0; i < texto.length; i++) {
    if (texto[i] == 'a') {
      cuenta++;
    }
  }
  print('letras a: $cuenta');
  print('posición de "na": ${texto.indexOf('na')}');
  print('contiene "nan": ${texto.contains('nan') ? 'sí' : 'no'}');

  var alReves = '';
  var j = texto.length - 1;
  while (j >= 0) {
    alReves += texto[j];
    j--;
  }
  print('al revés: $alReves');
}

Salida:

longitud: 6
primera: b, última: a
subcadena: nan
letras a: 3
posición de "na": 2
contiene "nan": sí
al revés: ananab

Los índices empiezan en 0 y el último es length - 1. Acceder fuera de rango lanza un RangeError.

Fíjate en el patrón de recorrido: una variable que va de la primera posición a la última (o al revés) y, dentro, una pregunta sobre la letra actual. Con él se cuenta, se busca y se invierte; es la base de los ejercicios de este apartado. Las cadenas ya traen métodos que lo hacen por ti (indexOf/find, contains...), pero conviene saber hacerlo a mano.

El final de una subcadena no se incluye

substring(2, 5) (o texto[2:5]) toma las posiciones 2, 3 y 4. Calcula el tamaño restando: 5 - 2 = 3 letras.

Transformar

void main() {
  final original = '  Hola, Mundo DAM  ';
  final limpio = original.trim();
  print('recortado: [$limpio]');
  print('mayúsculas: ${limpio.toUpperCase()}');
  print('minúsculas: ${limpio.toLowerCase()}');
  print('reemplazado: ${limpio.replaceAll('Mundo', 'Clase')}');

  final partes = limpio.split(', ');
  print('partes: ${partes.length} -> ${partes[0]} | ${partes[1]}');
  print('unido: ${partes.join('-')}');
  print('empieza por "Hola": ${limpio.startsWith('Hola') ? 'sí' : 'no'}');
  print('con ceros: ${'7'.padLeft(3, '0')}');
  print('original sigue igual: [$original]');
}

Salida:

recortado: [Hola, Mundo DAM]
mayúsculas: HOLA, MUNDO DAM
minúsculas: hola, mundo dam
reemplazado: Hola, Clase DAM
partes: 2 -> Hola | Mundo DAM
unido: Hola-Mundo DAM
empieza por "Hola": sí
con ceros: 007
original sigue igual: [  Hola, Mundo DAM  ]

Observa la última línea: tras todos los cambios, original no ha variado, porque cada método devuelve una cadena nueva. Si quieres quedarte con el resultado, guárdalo en una variable (limpio = original.strip()), no basta con llamar al método.

Los métodos más útiles

Operación En Dart
Longitud texto.length
Un carácter texto[i]
Subcadena (el final no se incluye) texto.substring(2, 5)
Buscar posición (-1 si no está) texto.indexOf('na')
¿Contiene? ¿Empieza? ¿Acaba? contains('nan') · startsWith('ba') · endsWith('na')
Reemplazar replaceAll('a', 'o')
Trocear / unir texto.split(', ') · partes.join('-')
Quitar espacios de los extremos trim()
Mayúsculas / minúsculas toUpperCase() · toLowerCase()
Rellenar a la izquierda '7'.padLeft(3, '0')
Repetir 'ab' * 3

Para darle la vuelta rápidamente: texto.split('').reversed.join(). Y para construir un texto grande con muchos trozos, usa StringBuffer en vez de += repetido.

Unicode

length cuenta unidades UTF-16, no «letras» que ve el usuario: un emoji ocupa 2. Para texto con emojis o símbolos compuestos usa texto.runes o el paquete characters.

Errores frecuentes

Error Cómo evitarlo
Llamar a un método y esperar que cambie la cadena Recoge el valor devuelto en una variable
Pasarse un puesto al recorrer (<= en lugar de <) El último índice es la longitud menos 1
Olvidar que el final de una subcadena no se incluye Cuenta las letras: final - inicio
Comparar mayúsculas con minúsculas Pasa los dos textos a minúsculas antes de comparar

Para practicar

Haz los ejercicios 3.0 de cadenas. Para ver cómo se escribe lo mismo en otro lenguaje: Pasar de uno a otro.