第十五章:字符串


本章目标

  1. 了解字符串的基本概念
  2. 掌握字符串常用的方法
  3. 字符串加强类StringBuilder

本章内容

1、什么是字符串?

  1. 概念:

    字符串是用于表示文本的一系列字符。它可以是字符,单词 或 用双引号“引起来的长段落。

    以下是字符串示例:

    示例:字符串字面量

    1
    2
    3
    4
    "S"
    "String"
    "This is a string."
    "大家好,我叫张三"
  2. 声明字符串的方法:

    有两种方法可以在C#中声明字符串变量。使用 System.String 类和 string 关键字。两者是相同的,没有区别。

    【示例】:String 和 string

    1
    2
    3
    string str1 = "Hello"// 使用字符串关键字
     
    String str2 = "Hello"// 使用System.String类
  3. 在C#中,字符串是字符的集合或数组。因此,可以使用char数组创建字符串,也可以像char数组一样访问字符串。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    char[] chars = {'H','e','l','l','o'};

    string str1 = new string(chars);  
    String str2 = new String(chars); 

    foreach (char c in str1)
    {
        Console.WriteLine(c);
    }

2、字符串的常用方法

方法 描述
Clone() 返回对此 String 实例的引用
Compare(String, String) 比较两个指定的 String 对象,并返回一个指示二者在排序顺序中的相对位置的整数
CompareOrdinal(String, String) 通过比较每个字符串中的字符,来比较两个字符串是否相等
CompareTo(String) 将一个字符串与另一个字符串进行比较
Concat(String, String) 连接两个指定的字符串
Contains(String) 判断一个字符串中是否包含另一个字符串
Copy(String) 将字符串的值复制一份,并赋值给另一个字符串
CopyTo(Int32, Char[], Int32, Int32) 从字符串中复制指定数量的字符到一个字符数组中
EndsWith(String) 用来判断字符串是否以指定的字符串结尾
Equals(String, String) 判断两个字符串是否相等
Format(String, Object) 将字符串格式化为指定的字符串表示形式
GetEnumerator() 返回一个可以循环访问此字符串中的每个字符的对象
GetHashCode() 返回该字符串的哈希代码
GetType() 获取当前实例的类型
GetTypeCode() 返回字符串的类型代码
IndexOf(String) 返回字符在字符串中的首次出现的索引位置,索引从零开始
Insert(Int32, String) 在字符串的指定位置插入另一个字符串,并返回新形成的字符串
Intern(String) 返回指定字符串的内存地址
IsInterned(String) 返回指定字符串的内存地址
IsNormalized() 判断此字符串是否符合 Unicode 标准
IsNullOrEmpty(String) 判断指定的字符串是否为空(null)或空字符串(””)
IsNullOrWhiteSpace(String) 判断指定的字符串是否为 null、空或仅由空白字符组成
Join(String, String[]) 串联字符串数组中的所有元素,并将每个元素使用指定的分隔符分隔开
LastIndexOf(Char) 获取某个字符在字符串中最后一次出现的位置
LastIndexOfAny(Char[]) 获取一个或多个字符在字符串中最后一次出现的位置
Normalize() 返回一个新字符串,新字符串与原字符串的值相等,但其二进制表示形式符合 Unicode 标准
PadLeft(Int32) 返回一个指定长度的新字符串,新字符串通过在原字符串左侧填充空格来达到指定的长度,从而实现右对齐
PadRight(Int32) 返回一个指定长度的新字符串,新字符串通过在原字符串右侧填充空格来达到指定的长度,从而实现左对齐
Remove(Int32) 返回一个指定长度的新字符串,将字符串中超出长度以外的部分全部删除
Replace(String, String) 使用指定字符替换字符串中的某个字符,并返回新形成的字符串
Split(Char[]) 按照某个分隔符将一个字符串拆分成一个字符串数组
StartsWith(String) 判断字符串是否使用指定的字符串开头
Substring(Int32) 从指定的位置截取字符串
ToCharArray() 将字符串中的字符复制到 Unicode 字符数组
ToLower() 将字符串中的字母转换为小写的形式
ToLowerInvariant() 使用固定区域性的大小写规则将字符串转换为小写的形式
ToString() 将其它数据类型转换为字符串类型
ToUpper() 将字符串中的字母转换为大写形式
Trim() 删除字符串首尾的空白字符
TrimEnd(Char[]) 删除字符串尾部的空白字符
TrimStart(Char[]) 删除字符串首部的空白字符

下面通过一些示例来演示一下 String 类中方法的使用。

【示例】比较两个字符串是否相同:

1
2
3
4
5
6
7
8
9
10
11
12
string str1 = "hello";
string str2 = "hello2";

int index = String.Compare(str1, str2);
if(index == 0)
{
Console.WriteLine("两个字符串相同!");
}
else
{
Console.WriteLine("两个字符串不相同");
}

【示例】连接两个字符串:Concat(String, String)

1
2
3
4
5
string str1 = "hello";
string str2 = "C#";

string newStr=String.Concat(str1," ", str2);
Console.WriteLine(newStr);

输出结果:

1
hello C#

【示例】 判断一个字符串中是否包含零一个字符串 :Contains(String)

1
2
3
4
5
6
7
8
9
10
11
12
string str1 = "hello C# ";
string str2 = "C#";

bool res = str1.Contains(str2);//判断是否包含
if (res)
{
Console.WriteLine("包含");
}
else
{
Console.WriteLine("不包含");
}

输出结果:

1
包含

【示例】演示C#中的字符串常用方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
string str1 = "hello C#";
string str2 = "C#";

bool isEnd = str1.EndsWith("C#");//判断是否以C#结尾
bool isStart = str1.StartsWith("he");//判断是否以he开头
int index = str1.IndexOf("o");//o首次出现的位置
int lastIndex = str1.LastIndexOf("l");//字母l最后一次出现的位置
string newStr = str1.Insert(2, str2);//将str2="C#" 插入到str1指定位置

string[] strs = { "a", "b", "c", "d" };
string newJoinStr = string.Join("-", strs);//将字符串数组用-串联
string newReplaceStr=str1.Replace("C#", "Java");//替换str1中的C#为java
string newSubstring=str1.Substring(0, 2);//截取字符串,从0的位置开始,截取长度为2
string[] splitStr=newJoinStr.Split('-');//将字符串用"-"分隔符,拆分成一个字符串数组

string lowerStr=str1.ToLower();//转换成小写字母
string upperStr=str1.ToUpper();//转换成大写
string trimStr=str1.Trim();//去除str1前后空格

Console.WriteLine(isEnd);
Console.WriteLine(isStart);
Console.WriteLine(index);
Console.WriteLine(lastIndex);
Console.WriteLine(newStr);
Console.WriteLine(newJoinStr);
Console.WriteLine(newReplaceStr);
Console.WriteLine(newSubstring);
foreach(string str in splitStr)
{
Console.Write(str+" ");
}
Console.WriteLine();
Console.WriteLine(lowerStr);
Console.WriteLine(upperStr);
Console.WriteLine(trimStr);
Console.ReadLine();

输出结果:

1
2
3
4
5
6
7
8
9
10
11
12
True
True
4
3
heC#llo C#
a-b-c-d
hello Java
he
a b c d
hello c#
HELLO C#
hello C#

综合案例:

  1. 输入邮箱地址,获取邮箱的用户名和后缀,例如:eagle_610@163.com,用户名:eagle_610,后缀:com

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Console.WriteLine("请输入邮箱:");
    string inputEmail = Console.ReadLine();

    //获取邮箱的用户名,则为@前面的字符串
    //1.获取@的位置和.的位置
    int index = inputEmail.IndexOf("@");
    int index2=inputEmail.LastIndexOf(".");

    //2.截取用户名
    string userName = inputEmail.Substring(0, index);
    string domainName=inputEmail.Substring(index2+1);
    Console.WriteLine("用户名为:{0},后缀:{1}", userName,domainName);

    Console.ReadKey();

3、StringBuilder类

  1. 为什么要使用stringBuilder?

    string是一个不可变的字符串,每次对string类型进行运算(赋值或拼接)的时候其实相当于重新生成了一个新的string对象,然后指针指向了新的string对象,会对系统的性能产生影响,不适合大量、频繁字符串的拼接。

  2. StringBuilder类

    是string的改版类,改善了string类拼接性能问题,通过Append方法拼接字符串。

    一般情况下看不出和string有和差异,但是如果对大量字符串进行添加操作,stringbuilder耗费的时间比string少的多。

  3. StringBuilder的特点

      1. 对象的容量有大小

        可容纳的最大字符数是可以改变的,可以通过设置Capacity属性来改变。在没有达到容量前,它不会自动重新分配空间;当达到容量时,将自动分配新的空间且容量翻倍。

        EnsureCapacity   方法可用来检查当前   StringBuilder   的容量。如果容量大于传递的值,则不进行任何更改;但是,如果容量小于传递的值,则会更改当前的容量以使其与传递的值匹配。

      2. 保存的字符串的大小

        所容纳的字符串的长度是Length属性,也可以查看或设置   Length   属性。如果将   Length   属性设置为大于   Capacity   属性的值,则自动将   Capacity   属性更改为与   Length   属性相同的值。如果将   Length   属性设置为小于当前   StringBuilder   对象内的字符串长度的值,则会缩短该字符串。

      3. 可以使用ToString()将缓冲区数据转换为字符串

  4. StringBuilder类的方法

    1. 创建StringBuilder对象

      1. 无参方式创建:

        1
        StringBuilder stringBuilder = new StringBuilder();
      2. 初始化字符串方式创建:

        1
        StringBuilder stringBuilder = new StringBuilder("hello");
      3. 创建时指定字符串长度方式创建:

        1
        2
        StringBuilder stringBuilder = new StringBuilder(10);
        Console.WriteLine(stringBuilder.Capacity);//创建对象时内存分配的最大字符数据,一旦超过则累加创建
    2. append()方法:拼接字符串

      在加入新字符串时,不会在内存中新开辟字符串空间,只是给原有的字符串尾部加入新字符串

      appendLine()方法:拼接后换行

      AppendFormat()方法:格式化拼接字符串

      1
      2
      3
      4
      StringBuilder stringBuilder = new StringBuilder("hello");
      stringBuilder.append(" C#");

      Console.WriteLine(stringBuilder);//输出:hello C#
    3. insert()方法:向指定位置插入数据

      1
      2
      3
      StringBuilder stringBuilder = new StringBuilder("hello c#");
      stringBuilder.Insert(0, "hi ");//在0的位置插入hi
      Console.WriteLine(stringBuilder);//输出:hi hello c#
    4. Remove()方法:移除指定范围的数据

      1
      2
      3
      StringBuilder stringBuilder = new StringBuilder("hello c#");
      stringBuilder.Remove(0,5);
      Console.WriteLine(stringBuilder);
    5. Replace方法:替换指定的字符串

      1
      2
      3
      StringBuilder stringBuilder = new StringBuilder("hello c#!");
      stringBuilder.Replace("!", "?");
      Console.WriteLine(stringBuilder);//输出:hello c#?

本章总结

课后作业

1.有一个姓名数组已经存储了10个姓名,请完成以下功能:
(1)查找姓”李”的人数量
(2)查找姓名中包含”杰”的人的数量
(3)查找姓名为三个及以上字数的人的数量
(4)将所有姓名中的”俊”替换为”帅”
(5)将所有姓名以”–”连接为一个新字符串后再输出

2.请输入一个姓名,然后截取其中”名”部分输出

3.请输入一个姓名,然后查找是否包含”志”,如果包含则输出其位置

4.请输入一个姓名,然后在其最前方插入”广创”,再输出。

5.请输入某人的英文名,然后转换为大写再输出。

6.请输入某人的姓名、性别、年龄,然后拼接起来再输出。

7.请输入一个姓名,然后转换成字符数组再输出。

8.请输入一个姓名,然后判断其长度是奇数还是偶数。

9.请输入一个姓名,然后输出其姓氏的哈希值。

10.输入一句英文短语,查找其中字母”b”的数量。