5 CADENAS

Las secciones siguientes describen el tipo de datos string, que es un alias para la clase String.

 

En esta sección

 

Utilizar cadenas (Guía de programación de C#)

Cómo: Analizar cadenas con el método Split (Guía de programación de C#)

Cómo: Buscar cadenas mediante los métodos String (Guía de programación de C#)

Cómo: Buscar cadenas mediante expresiones regulares (Guía de programación de C#)

Cómo: Unir varias cadenas (Guía de programación de C#)

Cómo: Modificar el contenido de cadenas (Guía de programación de C#)

 

 

 

 

 

Una cadena de C# es una matriz de caracteres que se declara utilizando la palabra clave string. Un literal de cadena se declara utilizando las comillas, como se muestra en el siguiente ejemplo:

 

string s = “Hello, World!”;

 

Puede extraer subcadenas y concatenar cadenas de la siguiente manera:

 

string s1 = “orange”;

string s2 = “red”;

 

s1 += s2;

System.Console.WriteLine(s1); // outputs “orangered”

 

s1 = s1.Substring(2, 5);

System.Console.WriteLine(s1); // outputs “anger”

 

Los objetos de cadena son inmutables, lo que significa que no se pueden cambiar una vez creados. Los métodos que actúan sobre las cadenas, devuelven los nuevos objetos de cadena. En el ejemplo anterior, cuando el contenido de s1 y s2 se concatenan para formar una sola cadena, las dos cadenas que contienen “orange” y “red” no se modifican. El operador += crea una nueva cadena que contiene el contenido combinado. Como resultado, s1 ahora hace referencia a una cadena totalmente diferente. Todavía existe una cadena que sólo contiene “orange” , pero deja de hacerse referencia a ella cuando se concatena s1.

 

Por consiguiente, y por razones de rendimiento, si se realizan grandes cantidades de concatenaciones u otras manipulaciones de cadenas, se debería utilizar la clase StringBuilder, de la siguiente manera:

 

System.Text.StringBuilder sb = new System.Text.StringBuilder();

sb.Append(“one “);

sb.Append(“two “);

sb.Append(“three”);

string str = sb.ToString(); 

 

La clase StringBuilder se describe con mayor detalle en la sección “Utilizar Stringbuilder”.

 

Trabajar con cadenas

Carácter de escape

Los caracteres de escape como “\n” y (nueva línea) y “\t” (tabulador) se pueden incluir en cadenas. La línea:

 

string hello = “Hello\nWorld!”; 

 

 

equivale a:

 

Hello

World!

 

Si desea incluir una barra diagonal inversa, ésta debe estar precedida de otra barra diagonal inversa. La cadena siguiente:

 

string filePath = “\\\\My Documents\\”; 

 

equivale a:

 

\\My Documents\

 

El símbolo @

 

El símbolo @ indica al constructor de cadena que debe omitir caracteres de escape y saltos de línea. Las dos cadenas siguientes son, por consiguiente, idénticas:

 

string p1 = “\\\\My Documents\\My Files\\”;

string p2 = @”\\My Documents\My Files\”; 

 

 

ToString()

Al igual que todos los objetos derivados de Object, las cadenas proporcionan el método ToString, que convierte un valor en una cadena. Este método se puede utilizar para convertir valores numéricos en cadenas de la siguiente manera:

 

int year = 1999;

string msg = “Eve was born in ” + year.ToString();

System.Console.WriteLine(msg); // outputs “Eve was born in 1999” 

 

Tener acceso a los caracteres individuales

 

Se obtiene acceso a los caracteres individuales contenidos en una cadena utilizando métodos como SubString(), Replace(),, Split() y Trim().

 

string s3 = “Visual C# Express”;

                

System.Console.WriteLine(s3.Substring(7, 2)); // outputs “C#”

System.Console.WriteLine(s3.Replace(“C#”, “Basic”)); // outputs “Visual Basic Express” 

También es posible copiar los caracteres en una matriz de caracteres, tal como se muestra a continuación:

 

string s4 = “Hello, World”;

char[] arr = s4.ToCharArray(0, s4.Length);

 

foreach (char c in arr)

{

System.Console.Write(c); // outputs “Hello, World”

} 

 

Puede obtener acceso a los caracteres individuales de una cadena con un índice:

 

string s5 = “Printing backwards”;

 

for (int i = 0; i < s5.Length; i++)

{

System.Console.Write(s5[s5.Length – i – 1]); // outputs “sdrawkcab gnitnirP”

} 

 

Cambiar mayúsculas y minúsculas

 

Para cambiar las letras en una cadena a mayúsculas o minúsculas, se utiliza ToUpper() o ToLower(), de la siguiente forma:

 

string s6 = “Battle of Hastings, 1066”;

 

System.Console.WriteLine(s6.ToUpper()); // outputs “BATTLE OF HASTINGS 1066”

System.Console.WriteLine(s6.ToLower()); // outputs “battle of hastings 1066”

 

Comparaciones

 

La manera más simple de comparar dos cadenas es utilizar los operadores == y !=, que realizan una comparación con distinción entre mayúsculas y minúsculas.

 

string color1 = “red”;

string color2 = “green”;

string color3 = “red”;

 

if (color1 == color3)

{

System.Console.WriteLine(“Equal”);

}

if (color1 != color2)

{

System.Console.WriteLine(“Not equal”);

} 

Los objetos String también tienen un método CompareTo() que devuelve un valor entero, basado en si una cadena es menor que (<) o mayor que (>) otra. Al comparar las cadenas, se utiliza el valor Unicode, y las minúsculas tienen un valor menor que las mayúsculas.

 

string s7 = “ABC”;

string s8 = “abc”;

 

if (s7.CompareTo(s8) > 0)

{

System.Console.WriteLine(“Greater-than”);

}

else

{

System.Console.WriteLine(“Less-than”);

} 

 

Para buscar una cadena dentro de otra, utilice IndexOf(). IndexOf() devuelve -1 si la cadena de búsqueda no se encuentra; en caso contrario devuelve el índice de la primera posición de la cadena, con base cero.

 

string s9 = “Battle of Hastings, 1066”;

 

System.Console.WriteLine(s9.IndexOf(“Hastings”)); // outputs 10

System.Console.WriteLine(s9.IndexOf(“1967”)); // outputs -1 

 

Dividir una cadena en subcadenas

 

Dividir una cadena en subcadenas (al igual que dividir una frase en palabras) es una tarea común de programación. El método Split() toma una matriz de char de delimitadores (por ejemplo, un carácter de espacio) y devuelve una matriz de subcadenas. Para obtener acceso a esta matriz con foreach:

 

char[] delimit = new char[] { ‘ ‘ };

string s10 = “The cat sat on the mat.”;

foreach (string substr in s10.Split(delimit))

{

System.Console.WriteLine(substr);

} 

 

Este código genera cada palabra en una línea separada de la siguiente forma:

 

The

cat

sat

on

the

mat.

 

Utilizar StringBuilder

 

La clase StringBuilder crea un búfer de cadena que proporciona el mejor rendimiento si el programa realiza una gran manipulación de cadenas. La cadena StringBuilder también permite reasignar los caracteres individuales, algo que el tipo de datos de cadena integrado no admite. Por ejemplo, este código cambia el contenido de una cadena sin crear una nueva cadena:

 

System.Text.StringBuilder sb = new System.Text.StringBuilder(“Rat: the ideal pet”);

sb[0] = ‘C’;

System.Console.WriteLine(sb.ToString());

System.Console.ReadLine(); 

 

En este ejemplo, se utiliza un objeto StringBuilder para crear una cadena a partir de un conjunto de tipos numéricos:

 

class TestStringBuilder

{

static void Main()

{

System.Text.StringBuilder sb = new System.Text.StringBuilder();

 

// Create a string composed of numbers 0 – 9

for (int i = 0; i < 10; i++)

{

sb.Append(i.ToString());

}

System.Console.WriteLine(sb); // displays 0123456789

 

// Copy one character of the string (not possible with a System.String)

sb[0] = sb[9];

 

System.Console.WriteLine(sb); // displays 9123456789

}

} 

 

 

 

 

 

5.2.- ANALIZAR CADENAS CON EL MÉTODO SPLIT

 

El ejemplo de código siguiente muestra cómo analizar una cadena con el método System.String.Split. Este método devuelve una matriz de cadenas en la que cada elemento es una palabra. Como entrada, Split toma una matriz de caracteres que indican los caracteres que se utilizan como delimitadores. En este ejemplo, se utilizan espacios, comas, dos puntos, puntos y comas y tabuladores. Se pasa una matriz que contiene estos delimitadores a Split, y cada palabra de la frase se muestra por separado utilizando la matriz de cadenas resultante.

 

Ejemplo

class TestStringSplit

{

static void Main()

{

char[] delimiterChars = { ‘ ‘, ‘,’, ‘.’, ‘:’, ‘\t’ };

 

string text = “one\ttwo three:four,five six seven”;

System.Console.WriteLine(“Original text: ‘{0}'”, text);

 

string[] words = text.Split(delimiterChars);

System.Console.WriteLine(“{0} words in text:”, words.Length);

 

foreach (string s in words)

{

System.Console.WriteLine(s);

}

}

} 

 

Resultados

Original text: ‘one two three:four,five six seven’

7 words in text:

one

two

three

four

five

six

seven 

 

 

 

 

 

 

5.3.- BUSCAR CADENAS MEDIANTE LOS MÉTODOS STRING

 

El tipo string, que es un alias de la clase System.String, proporciona varios métodos útiles para buscar el contenido de una cadena. El ejemplo siguiente utiliza los métodos IndexOf, LastIndexOf, StartsWith y EndsWith.

 

Ejemplo

class StringSearch

{

static void Main()

{

string str = “A silly sentence used for silly purposes.”;

System.Console.WriteLine(“‘{0}'”,str);

 

bool test1 = str.StartsWith(“a silly”);

System.Console.WriteLine(“starts with ‘a silly’? {0}”, test1);

 

bool test2 = str.StartsWith(“a silly”, System.StringComparison.OrdinalIgnoreCase);

System.Console.WriteLine(“starts with ‘a silly’? {0} (ignoring case)”, test2);

 

bool test3 = str.EndsWith(“.”);

System.Console.WriteLine(“ends with ‘.’? {0}”, test3);

 

int first = str.IndexOf(“silly”);

int last = str.LastIndexOf(“silly”);

string str2 = str.Substring(first, last – first);

System.Console.WriteLine(“between two ‘silly’ words: ‘{0}'”, str2);

}

} 

 

Resultados

‘A silly sentence used for silly purposes.’

starts with ‘a silly’? False

starts with ‘a silly’? True (ignore case)

ends with ‘.’? True

between two ‘silly’ words: ‘silly sentence used for ‘

 

 

 

 

5.4.- BUSCAR CADENAS MEDIANTE EXPRESIONES REGULARES

 

La clase System.Text.RegularExpressions.Regex se puede utilizar para buscar cadenas. Estas búsquedas pueden tener distinta complejidad, desde ser muy sencillas hasta hacer un gran uso de expresiones regulares. A continuación se ofrecen dos ejemplos de búsqueda de cadenas con la clase Regex. Para obtener más información, vea Expresiones regulares de .NET Framework.

 

Ejemplo

El código siguiente es una aplicación de consola que realiza una búsqueda simple de cadenas sin distinción entre mayúsculas y minúsculas en una matriz. El método estático System.Text.RegularExpressions.Regex.IsMatch(System.String,System.String,System.Text.RegularExpressions.RegexOptions) realiza la búsqueda a partir de la cadena de búsqueda y de la cadena que contiene el patrón de búsqueda. En este caso, se utiliza un tercer argumento para indicar que no se debe distinguir entre mayúsculas y minúsculas. Para obtener más información, vea System.Text.RegularExpressions.RegexOptions.

 

class TestRegularExpressions

{

static void Main()

{

string[] sentences =

{

“cow over the moon”,

“Betsy the Cow”,

“cowering in the corner”,

“no match here”

};

 

string sPattern = “cow”;

 

foreach (string s in sentences)

{

System.Console.Write(“{0,24}”, s);

 

if (System.Text.RegularExpressions.Regex.IsMatch(s, sPattern, System.Text.RegularExpressions.RegexOptions.IgnoreCase))

{

System.Console.WriteLine(” (match for ‘{0}’ found)”, sPattern);

}

else

{

System.Console.WriteLine();

}

}

}

} 

 

Resultados

cow over the moon (match for ‘cow’ found)

Betsy the Cow (match for ‘cow’ found)

cowering in the corner (match for ‘cow’ found)

no match here 

 

El código siguiente es una aplicación de consola que utiliza expresiones regulares para validar el formato de cada cadena de una matriz. La validación requiere que cada cadena tenga la forma de un número de teléfono en el que tres grupos de dígitos se separan por guiones. Los dos primeros grupos contienen tres dígitos, y el tercero, cuatro. Esto se logra con la expresión regular ^\\d{3}-\\d{3}-\\d{4}$. Para obtener más información, vea Elementos del lenguaje de expresiones regulares.

 

class TestRegularExpressionValidation

{

static void Main()

{

string[] numbers =     

{

“123-456-7890”,

“444-234-22450”,

“690-203-6578”,

“146-893-232”,

“146-839-2322”,

“4007-295-1111”,

“407-295-1111”,

“407-2-5555”,

};

 

string sPattern = “^\\d{3}-\\d{3}-\\d{4}$”;

 

foreach (string s in numbers)

{

System.Console.Write(“{0,14}”, s);

 

if (System.Text.RegularExpressions.Regex.IsMatch(s, sPattern))

{

System.Console.WriteLine(” – valid”);

}

else

{

System.Console.WriteLine(” – invalid”);

}

}

}

} 

 

Resultados

123-456-7890 – valid

444-234-22450 – invalid

690-203-6578 – valid

146-893-232 – invalid

146-839-2322 – valid

4007-295-1111 – invalid

407-295-1111 – valid

407-2-5555 – invalid 

 

 

 

 

5.5.- UNIR VARIAS CADENAS

 

Hay dos maneras de unir varias cadenas: con el operador + que la clase String sobrecarga y con la clase StringBuilder. El operador + es fácil de usar y hace el código más intuitivo, pero trabaja en serie; se crea una nueva cadena para cada uso del operador, de modo que cambiar varios operadores a la vez es ineficiente. Por ejemplo:

 

string two = “two”;

string str = “one ” + two + ” three”;

System.Console.WriteLine(str); 

 

Aunque aparecen cuatro cadenas en el código (las tres cadenas que se combinan y la cadena final que contiene las otras tres), se crean cinco cadenas en total porque las dos primeras se combinan primero y crean una cadena que contiene “one two”. La tercera se anexa separadamente para formar la cadena final almacenada en str.

Alternativamente, la clase StringBuilder se puede utilizar para agregar cada cadena a un objeto que, a continuación, crea la cadena final en un paso. Esta estrategia se muestra en el ejemplo siguiente.

 

Ejemplo

En el código siguiente se utiliza el método Append de la clase StringBuilder para combinar tres cadenas sin el efecto de encadenamiento del operador +.

 

class StringBuilderTest

{

static void Main()

{

string two = “two”;

 

System.Text.StringBuilder sb = new System.Text.StringBuilder();

sb.Append(“one “);

sb.Append(two);

sb.Append(” three”);

System.Console.WriteLine(sb.ToString());

 

string str = sb.ToString();

System.Console.WriteLine(str);

}

} 

 

 

 

 

 

5.6.- MODIFICAR EL CONTENIDO DE CADENAS

 

Las cadenas son inmutables, por lo que no es posible modificar su contenido. Sin embargo, el contenido de una cadena se puede extraer a un formulario no inmutable y modificarse para formar a continuación una nueva instancia de la cadena.

 

Ejemplo

En el ejemplo siguiente se utiliza el método ToCharArray para extraer el contenido de una cadena a una matriz de tipo char. A continuación, se modifican algunos de los elementos de esa matriz. Después se utiliza la matriz char para crear una nueva instancia de la cadena.

 

class ModifyStrings

{

static void Main()

{

string str = “The quick brown fox jumped over the fence”;

System.Console.WriteLine(str);

 

char[] chars = str.ToCharArray();

int animalIndex = str.IndexOf(“fox”);

if (animalIndex != -1)

{

chars[animalIndex++] = ‘c’;

chars[animalIndex++] = ‘a’;

chars[animalIndex] = ‘t’;

}

 

string str2 = new string(chars);

System.Console.WriteLine(str2);

}

} 

 

Resultados

The quick brown fox jumped over the fence

The quick brown cat jumped over the fence