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


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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/964334.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

深入解析“legit”的地道用法——从俚语到正式表达:Sam Altman用来形容DeepSeek: legit invigorating(真的令人振奋)

深入解析“legit”的地道用法——从俚语到正式表达 一、引言 在社交媒体、科技圈甚至日常对话中&#xff0c;我们经常会看到或听到“legit”这个词。比如最近 Sam Altman 在 X&#xff08;原 Twitter&#xff09;上发的一条帖子中写道&#xff1a; we will obviously deliver …

物联网领域的MQTT协议,优势和应用场景

MQTT&#xff08;Message Queuing Telemetry Transport&#xff09;作为轻量级发布/订阅协议&#xff0c;凭借其低带宽消耗、低功耗与高扩展性&#xff0c;已成为物联网通信的事实标准。其核心优势包括&#xff1a;基于TCP/IP的异步通信机制、支持QoS&#xff08;服务质量&…

【Hadoop】Hadoop的HDFS

这里写目录标题 HDFS概述HDFS产出背景及定义HDFS产生背景HDFS定义 HDFS优缺点HDFS优点HDFS缺点 HDFS组成架构HDFS文件块大小 HDFS的Shell操作常用命令实操准备工作上传下载HDFS直接操作 HDFS的API操作客户端环境准备HDFS的API案例实操HDFS文件上传HDFS文件下载HDFS文件更名和移…

二、面向对象

一、结构体类型 结构体类型是一种自定义类型&#xff0c;用于创建我们游戏或者实际业务中的自定义类型. 代码中变量有通用的&#xff0c;可以使用结构体&#xff0c;包裹起来。 1、成员变量 /// <summary> /// 英雄结构体 /// </summary> struct Hero {//成员p…

基于机器学习的布伦特原油价格的分析与研究

项目&#xff1a;基于机器学习的布伦特原油价格的分析与研究 摘 要 布伦特原油期货及现货市场所构成的布伦特原油定价体系&#xff0c;最多时竟涵盖了世界原油交易量的80%&#xff0c;即使在纽约原油价格日益重要的今天&#xff0c;全球仍有约65%的原油交易量&#xff0c;是以…

excel实用问题:提取文字当中的数字进行运算

0、前言&#xff1a; 这里汇总在使用excel工作过程中遇到的问题&#xff0c;excel使用wps版本&#xff0c;小规模数据我们自己提取数据可行&#xff0c;大规模数据就有些难受了&#xff0c;因此就产生了如下处理办法。 需求&#xff1a;需要把所有文字当中的数字提取出来&…

贝叶斯-概率

起点&#xff1a;玩猜硬币游戏中发现贝叶斯定理貌似有很强的预测功能&#xff0c;细看还真有那么回事&#xff0c;因此研究研究。当然&#xff0c;看起来学精后不止可用来猜硬币&#xff0c;也可猜其它玩艺。 贝叶斯统计的基础是贝叶斯定理&#xff0c;贝叶斯定理的基础是条件…

信息安全专业2025最新毕业设计选题汇总:课题精选

目录 前言 毕设选题 开题指导建议 更多精选选题 选题帮助 最后 前言 大家好,这里是海浪学长毕设专题! 大四是整个大学期间最忙碌的时光&#xff0c;一边要忙着准备考研、考公、考教资或者实习为毕业后面临的升学就业做准备,一边要为毕业设计耗费大量精力。学长给大家整理…

[LeetCode]day13 19.删除链表的倒数第n个结点

19. 删除链表的倒数第 N 个结点 - 力扣&#xff08;LeetCode&#xff09; 题目描述 给你一个链表&#xff0c;删除链表的倒数第 n 个结点&#xff0c;并且返回链表的头结点。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5], n 2 输出&#xff1a;[1,2,3,5]示例 2&a…

2024年终总结来了

忘记发CSDN的年度总结了&#xff0c;今天补上吧 说实话&#xff0c;今年过得不是特别好&#xff0c;感觉遇到了瓶颈&#xff0c;人生变得迷茫起来。不知道大家有没有同样的感受 刚毕业的时候人生充满了憧憬&#xff0c;慢慢的随着年龄变大后&#xff0c;就会觉得一事无成&…

Haproxy+keepalived高可用集群,haproxy宕机的解决方案

Haproxykeepalived高可用集群&#xff0c;允许keepalived宕机&#xff0c;允许后端真实服务器宕机&#xff0c;但是不允许haproxy宕机&#xff0c; 所以下面就是解决方案 keepalived配置高可用检测脚本 &#xff0c;master和backup都要添加 配置脚本 # vim /etc/keepalived…

树莓派pico入坑笔记,故障解决:请求 USB 设备描述符失败,故障码(43)

今天心血来潮&#xff0c;拿出吃灰的pico把玩一下&#xff0c;打开thonny&#xff0c;上电&#xff0c;然后...... 上电识别不到端口&#xff0c;windows报错&#xff0c;请求 USB 设备描述符失败&#xff0c;故障码&#xff08;43&#xff09; 一开始以为是坏了&#xff08;磕…

从Transformer到世界模型:AGI核心架构演进

文章目录 引言:架构革命推动AGI进化一、Transformer:重新定义序列建模1.1 注意力机制的革命性突破1.2 从NLP到跨模态演进1.3 规模扩展的黄金定律二、通向世界模型的关键跃迁2.1 从语言模型到认知架构2.2 世界模型的核心特征2.3 混合架构的突破三、构建世界模型的技术路径3.1 …

2025年01月25日Github流行趋势

项目名称&#xff1a;it-tools 项目地址url&#xff1a;https://github.com/CorentinTh/it-tools项目语言&#xff1a;Vue历史star数&#xff1a;25298今日star数&#xff1a;212项目维护者&#xff1a;CorentinTh, apps/renovate, cgoIT, sharevb, marvin-j97项目简介&#xf…

鸿蒙Harmony-双向数据绑定MVVM以及$$语法糖介绍

鸿蒙Harmony-双向数据绑定MVVM以及$$语法糖介绍 1.1 双向数据绑定概念 在鸿蒙&#xff08;HarmonyOS&#xff09;应用开发中&#xff0c;双向数据改变&#xff08;或双向数据绑定&#xff09;是一种让数据模型和UI组件之间保持同步的机制&#xff0c;当数据发生变化时&#x…

【DeepSeek背后的技术】系列二:大模型知识蒸馏(Knowledge Distillation)

目录 1 引言2 操作步骤和公式说明2.1 准备教师模型&#xff08;Teacher Model&#xff09;和学生模型&#xff08;Student Model&#xff09;2.2 生成软标签&#xff08;Soft Labels&#xff09;2.3 定义蒸馏损失函数2.4 训练学生模型2.5 调整超参数2.6 评估与部署 3 其他知识蒸…

【BUUCTF杂项题】后门查杀、webshell后门

前言&#xff1a;Webshell 本质上是一段可在 Web 服务器上执行的脚本代码&#xff0c;通常以文件形式存在于 Web 服务器的网站目录中。黑客通过利用 Web 应用程序的漏洞&#xff0c;如 SQL 注入、文件上传漏洞、命令执行漏洞等&#xff0c;将 Webshell 脚本上传到服务器&#x…

SPI(Serial Peripheral Interface)串行外围设备接口

SPI概述&#xff1a; SPI协议最初由Motorola公司&#xff08;现为NXP Semiconductors的一部分&#xff09;在20世纪80年代中期开发。最初是为了在其68000系列微控制器中实现高速、高效的串行通信。该协议旨在简化微控制器与外围设备之间的数据传输。 1980年代&#xff1a;SPI协…

深度学习 Pytorch 基础网络手动搭建与快速实现

为了方便后续练习的展开&#xff0c;我们尝试自己创建一个数据生成器&#xff0c;用于自主生成一些符合某些条件、具备某些特性的数据集。 导入相关的包 # 随机模块 import random# 绘图模块 import matplotlib as mpl import matplotlib.pyplot as plt# 导入numpy import nu…

10分钟快速上手DeepSeek!

DeepSeek 是一款基于命令行和配置文件的数据处理工具&#xff0c;支持多种数据格式&#xff08;如 CSV、JSON、SQL 等&#xff09;和多种数据源&#xff08;如本地文件、数据库、API 等&#xff09;。 它的核心功能包括&#xff1a; 数据导入与导出&#xff1a;支持从多种数据…