C# 字符串与正则表达式介绍

ops/2025/2/6 22:05:07/

.NET学习资料

.NET学习资料

.NET学习资料


在 C# 编程中,字符串和正则表达式是处理文本数据时不可或缺的工具。深入理解它们的特性和用法,能够显著提升开发效率和代码质量。

一、C# 字符串

(一)字符串的不可变性

在 C# 中,字符串类型string是不可变的。这意味着一旦创建了一个字符串对象,其内容就无法直接更改。当对字符串进行诸如拼接、裁剪或替换等操作时,实际上会创建一个新的字符串对象,而非修改原有的对象。

这种不可变性设计基于多方面的考量:

性能优化:.NET 运行时可以对字符串进行缓存和共享。相同内容的字符串在字符串池(String Intern Pool)中可以共用内存,从而减少内存占用。例如:

string str1 = "Hello";
string str2 = "Hello";
Console.WriteLine(object.ReferenceEquals(str1, str2)); // 输出True,表明str1和str2指向同一个内存地址

安全性:在多线程环境下,不可变的字符串是安全的。多个线程可以同时读取相同的字符串对象,而无需担心数据被意外修改。

易于调试:不可变对象减少了意外更改的风险,使得代码调试和追踪更加容易。

(二)常用字符串操作方法

查找方法

IndexOf():查找某字符或字符串在目标字符串中第一次出现的下标,索引从 0 开始。若未找到对应数据,则返回 - 1。例如:

string text = "Hello, World!";
int index = text.IndexOf("World");
Console.WriteLine(index); // 输出7

LastIndexOf():查找某字符或字符串在目标字符串中最后一次出现的下标,若未找到则返回 - 1。例如:

string text = "Hello, World! World";
int lastIndex = text.LastIndexOf("World");
Console.WriteLine(lastIndex); // 输出13

Contains():检测字符串中是否包含指定的数据,返回布尔值。例如:

string text = "Hello, World!";
bool contains = text.Contains("Hello");
Console.WriteLine(contains); // 输出True
截取方法

Substring():从目标字符串中截取数据,有两种重载形式。一种是从指定位置截取到字符串末尾,另一种是从指定位置开始截取指定长度的字符。例如:

string text = "Hello, World!";
string sub1 = text.Substring(7);
string sub2 = text.Substring(0, 5);
Console.WriteLine(sub1); // 输出World!
Console.WriteLine(sub2); // 输出Hello
分割与连接方法

Split():根据指定的字符分割字符串,返回字符串数组。例如:

string text = "apple,banana,orange";
string[] fruits = text.Split(',');
foreach (string fruit in fruits)
{Console.WriteLine(fruit);
}

Join():使用指定字符串连接一些字符串,组成新的字符串。这是string的静态方法。例如:

string[] fruits = { "apple", "banana", "orange" };
string joined = string.Join(", ", fruits);
Console.WriteLine(joined); // 输出apple, banana, orange
替换方法

Replace():使用指定字符或字符串替换目标字符串中的数据,常用于敏感词替换等场景。例如:

string text = "Hello, World!";
string replaced = text.Replace("World", "C#");
Console.WriteLine(replaced); // 输出Hello, C#!
格式化方法

Format():用于格式化字符串,通过占位符将不同类型的数据插入到字符串中。例如:

string name = "Alice";
int age = 30;
string message = string.Format("My name is {0}, and I'm {1} years old.", name, age);
Console.WriteLine(message); // 输出My name is Alice, and I'm 30 years old.

(三)StringBuilder 类

由于string的不可变性,在需要频繁修改字符串的场景下,会产生大量临时对象,影响性能。此时,StringBuilder类应运而生。StringBuilder是可变的,适用于高性能的字符串操作。

例如,当进行大量字符串拼接时:

// 使用string
string result1 = "";
for (int i = 0; i < 1000; i++)
{result1 += i.ToString();
}// 使用StringBuilder
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 1000; i++)
{sb.Append(i.ToString());
}
string result2 = sb.ToString();

可以明显看出,使用StringBuilder在性能上更具优势,因为它直接在原对象上进行修改,避免了大量临时字符串对象的创建。

二、C# 正则表达式

(一)正则表达式基础语法

正则表达式是一种用于匹配和操作文本的强大工具,它通过特定的字符模式来描述文本的特征。

字符匹配

.:匹配除换行符之外的任何单个字符。例如,模式a.c可以匹配abc、a1c等。

[字符集合]:匹配字符集合中的任意一个字符。例如,[aeiou]可以匹配任何一个元音字母。

[^字符集合]:匹配不在字符集合中的任意一个字符。例如,[^0-9]可以匹配任何非数字字符。

数量限定符

*:匹配前面的子表达式零次或多次。例如,a*可以匹配空字符串、a、aa等。

+:匹配前面的子表达式一次或多次。例如,a+可以匹配a、aa等,但不能匹配空字符串。

?:匹配前面的子表达式零次或一次。例如,a?可以匹配空字符串或a。

{n}:匹配前面的子表达式恰好n次。例如,a{3}只能匹配aaa。

{n,}:匹配前面的子表达式至少n次。例如,a{3,}可以匹配aaa、aaaa等。

{n,m}:匹配前面的子表达式至少n次,最多m次。例如,a{3,5}可以匹配aaa、aaaa、aaaaa。

边界匹配

^:匹配输入字符串的开始位置。例如,^Hello表示以Hello开头的字符串。

$:匹配输入字符串的结束位置。例如,World$表示以World结尾的字符串。

(二)常用正则表达式示例

验证数字

只能输入数字:^(0-9)*$

只能输入 n 位的数字:^\d{n}$

只能输入至少 n 位的数字:^\d{n,}$

只能输入 m~n 位的数字:^\d{m,n}$

只能输入零和非零开头的数字:^(0|(1-9)\d*)$

验证邮箱地址
^\w+((-\w+)|(\.\w+))*\@\w+((\.|-)\w+)*\.\w+$
验证 URL 地址
^http(s)?://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?$

(三)在 C# 中使用正则表达式

在 C# 中,使用System.Text.RegularExpressions命名空间来操作正则表达式。主要涉及的类有Regex和Match、MatchCollection。

例如,验证一个字符串是否为有效的邮箱地址:

using System;
using System.Text.RegularExpressions;class Program
{static void Main(){string email = "test@example.com";string pattern = @"^\w+((-\w+)|(\.\w+))*\@\w+((\.|-)\w+)*\.\w+$";bool isMatch = Regex.IsMatch(email, pattern);if (isMatch){Console.WriteLine("Valid email address.");}else{Console.WriteLine("Invalid email address.");}}
}

如果需要获取匹配的具体内容,可以使用Regex.Match方法返回Match对象,或使用Regex.Matches方法返回MatchCollection对象。例如:

string text = "The quick brown fox jumps over the lazy dog. The dog is cute.";
string pattern = @"dog";
MatchCollection matches = Regex.Matches(text, pattern);
foreach (Match match in matches)
{Console.WriteLine("Match found at index {0}: {1}", match.Index, match.Value);
}

C# 字符串和正则表达式在文本处理中各有其独特的作用。字符串提供了基本的文本操作功能,而正则表达式则能实现更复杂的模式匹配和文本验证。在实际编程中,应根据具体需求灵活运用它们,以实现高效、准确的文本处理。


http://www.ppmy.cn/ops/156257.html

相关文章

Java牙科诊所管理系统web医院病例挂号预约平台springboot/ssm代码编写

Java牙科诊所管理系统web医院病例挂号预约平台springboot/ssm代码编写 基于springboot(可改ssm)htmlvue项目 开发语言&#xff1a;Java 框架&#xff1a;springboot/可改ssm vue JDK版本&#xff1a;JDK1.8&#xff08;或11&#xff09; 服务器&#xff1a;tomcat 数据库&…

基础相对薄弱怎么考研

复习总体规划 明确目标 选择专业和院校&#xff1a;根据你的兴趣、职业规划和自身实力&#xff0c;选择适合自己的专业和院校。可以参考往年的分数线、报录比、复试难度等。了解考试科目&#xff1a;不同专业考试科目不同&#xff0c;一般包括&#xff1a; 公共课&#xff1a…

鸢尾花书《编程不难》01---基本介绍和Jupyterlab的上手

文章目录 1.致谢和推荐2.py和.ipynb区别3.Jupyterlab的上手3.1入口3.2页面展示3.3相关键介绍3.4代码的运行3.5重命名3.6latex和markdown说明 1.致谢和推荐 这个系列是关于一套书籍&#xff0c;结合了python和数学&#xff0c;机器学习等等相关的理论&#xff0c;总结的7本书籍…

【含文档+PPT+源码】基于微信小程序的校园快递平台

项目介绍 本课程演示的是一款基于微信小程序的校园快递平台&#xff0c;主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的 Java 学习者。 1.包含&#xff1a;项目源码、项目文档、数据库脚本、软件工具等所有资料 2.带你从零开始部署运行本套系统 3.该项目附带…

基于遗传算法的256QAM星座图的最优概率整形matlab仿真,对比优化前后整形星座图和误码率

目录 1.算法仿真效果 2.算法涉及理论知识概要 3.MATLAB核心程序 4.完整算法代码文件获得 1.算法仿真效果 matlab2022a仿真结果如下&#xff08;完整代码运行后无水印&#xff09;&#xff1a; GA优化曲线&#xff1a; 优化前后星座图对比 优化前后误码率对比 仿真操作步骤…

R语言 | 使用 ComplexHeatmap 绘制热图,分区并给对角线分区加黑边框

目的&#xff1a;画热图&#xff0c;分区&#xff0c;给对角线分区添加黑色边框 建议直接看0和4。 0. 准备数据 # 安装并加载必要的包 #install.packages("ComplexHeatmap") # 如果尚未安装 library(ComplexHeatmap)# 使用 iris 数据集 #data(iris)# 选择数值列&a…

通过C/C++编程语言实现“数据结构”课程中的链表

引言 链表(Linked List)是数据结构中最基础且最重要的线性存储结构之一。与数组的连续内存分配不同,链表通过指针将分散的内存块串联起来,具有动态扩展和高效插入/删除的特性。本文将以C/C++语言为例,从底层原理到代码实现,手把手教你构建完整的链表结构,并深入探讨其应…

OpenCV:SIFT关键点检测与描述子计算

目录 1. 什么是 SIFT&#xff1f; 2. SIFT 的核心步骤 2.1 尺度空间构建 2.2 关键点检测与精细化 2.3 方向分配 2.4 计算特征描述子 3. OpenCV SIFT API 介绍 3.1 cv2.SIFT_create() 3.2 sift.detect() 3.3 sift.compute() 3.4 sift.detectAndCompute() 4. SIFT 关…