1. 在字符串中查找子串
上节课你已经学会了怎么从字符串里拿出子串。这节我们来学怎么在一个字符串里找到另一个字符串。有5个超好用的方法:
Contains方法:字符串里有没有这个子串?
如果你传进去的字符串在当前字符串里有,返回true。
string phrase = "风的变化";
bool hasWord = phrase.Contains("变化"); // true
查找是区分大小写的!"风".Contains("风") — false。
IndexOf方法:找到子串的位置
跟数组里的IndexOf差不多:从头到尾找子串,返回第一次出现的位置。
string text = "西瓜西瓜";
int index = text.IndexOf("瓜"); // 2
- 如果没找到,返回-1。
- 还可以指定起始位置:IndexOf("瓜", 4)。和数组用法一样。
LastIndexOf方法:最后一次出现
也跟数组里的LastIndexOf差不多:从后往前找子串,返回最后一次出现的位置。
string repeated = "任务 任务";
int last = repeated.LastIndexOf("任务"); // 7
字符串是否以指定子串开头/结尾
很多时候你想知道字符串是不是以某个子串开头(或结尾)。有两个方法:
- StartsWith — 检查字符串是不是以某个子串开头;
- EndsWith — 检查字符串是不是以某个子串结尾。
string fileName = "photo.jpg";
bool isJpg = fileName.EndsWith(".jpg"); // true
string email = "support@company.com";
bool isSupport = email.StartsWith("support"); // true
如果你想忽略大小写,可以传个额外参数指定比较模式(看文档里的StringComparison.OrdinalIgnoreCase)。
2. Replace方法:替换字符和子串
Replace方法会把所有A字符串都换成B字符串。最早是用来修错别字、做敏感词过滤、模板变量替换啥的!(开个玩笑。)
string address = "伦敦, 贝克街";
string updated = address.Replace("伦敦", "巴黎");
Console.WriteLine(updated); // "巴黎, 贝克街"
- 你甚至可以只换单个字符:str.Replace('a', 'z')
- 注意:所有匹配都会被换掉,不只是第一个。
3. Split方法:把字符串切成小块
Split方法干的事就是:拿你的字符串,用分隔符(字符或字符串)把它切开。它会返回一个字符串数组,就是切出来的每一块。
string[] parts = originalString.Split(separator);
- separator — 你用来分割的字符或字符数组。
最简单的例子
按空格分割字符串:
string input = "苹果 梨 橙子 香蕉";
string[] fruits = input.Split(' '); // 得到数组 ["苹果","梨","橙子","香蕉"]
Console.WriteLine(fruits[0]); // "苹果"
Console.WriteLine(fruits[1]); // "梨"
这样我们就得到了长度为4的字符串数组,每个单词就是一个元素。
多个分隔符
有时候字符串里不止一种分隔符。比如用户可能用空格、逗号或者分号分隔。
这种情况可以用字符数组当分隔符:
string input = "苹果, 梨; 橙子 香蕉";
char[] separators = { ' ', ',', ';' };
string[] fruits = input.Split(separators, StringSplitOptions.RemoveEmptyEntries);
小技巧:可选参数StringSplitOptions.RemoveEmptyEntries会把空的片段去掉。比如用户连续输两个分隔符——像"苹果,, 梨"这种。
按子串分割
分隔符也可以是字符串,不只是单个字符。比如你有个CSV文件,分隔符是";"或者|:
// 单字符分隔符
string data = "Smith;Jones;Doe";
string[] names = data.Split(';'); // 按';'分割
// 或者分隔符是整个字符串:
string log = "2024-01-01::错误::任务执行失败";
string[] separators = { "::" };
string[] parts = log.Split(separators);
4. Join方法:把字符串数组拼回去
Join方法干的事正好相反:它接收一个字符串数组,把它们拼成一个字符串,中间插你指定的分隔符。
string result = string.Join(separator, arrayOfStrings);
- separator — 插在每个元素之间的字符串。
- arrayOfStrings — 字符串数组或集合(string[]、List<string>等)。
最简单的例子
把字符串数组用逗号拼成一个字符串:
string[] items = { "苹果", "梨", "橙子", "香蕉" };
string joined = string.Join(", ", items);
Console.WriteLine(joined); // "苹果, 梨, 橙子, 香蕉"
用空分隔符拼接——直接合成一串
有时候你就想把字符串直接拼起来,中间啥都不加:
string[] parts = { "我", "爱", "C#" };
string message = string.Join("", parts);
Console.WriteLine(message); // "我爱C#"
5. 常见错误
很多新手开发者经常忘了在用Split分割字符串后把多余的空格去掉。比如用户手抖写了"苹果, 梨 ,香蕉",Split后会有" 梨 "这种元素。如果直接转数字或比较,肯定出bug。记得Split后对每个元素用Trim()——这是个好习惯。
还有一个问题——多出来的空字符串。用户连续输两个分隔符,或者字符串开头结尾就是分隔符,Split会返回空元素。加上StringSplitOptions.RemoveEmptyEntries,这样就不会踩坑了。
如果你传给Join的数组里有空元素或者null,Join会直接忽略它们。但如果你不想这样(比如做报表时要显示哪些值被漏掉了),那就得自己先处理数组。
还有一点:Split永远不会改原字符串,只会返回新数组。Join也不会改原数组,只会返回新字符串。记住:C#里的字符串和数组都是不可变的(immutable)。
GO TO FULL VERSION