当前位置: 首页 > news >正文

C# 正则表达式完全指南

C# 正则表达式完全指南

C#通过 System.Text.RegularExpressions 命名空间提供强大的正则表达式支持。本指南将详细介绍C#中正则表达式的使用方法、性能优化和最佳实践。

1. 基础知识

1.1 命名空间导入

using System.Text.RegularExpressions;

1.2 基本使用

public class RegexBasics
{public void BasicExamples(){string text = "Hello, my phone is 123-456-7890";// 创建正则表达式对象Regex regex = new Regex(@"\d+");// 检查是否匹配bool isMatch = regex.IsMatch(text);// 查找第一个匹配Match match = regex.Match(text);if (match.Success){Console.WriteLine($"Found: {match.Value}");}// 查找所有匹配MatchCollection matches = regex.Matches(text);foreach (Match m in matches){Console.WriteLine($"Found: {m.Value}");}}
}

1.3 正则表达式选项

public class RegexOptions
{public void OptionsExample(){// 不区分大小写Regex caseInsensitive = new Regex(@"hello", RegexOptions.IgnoreCase);// 多行模式Regex multiline = new Regex(@"^start", RegexOptions.Multiline);// 忽略空白字符和注释Regex ignored = new Regex(@"\d+  # 匹配数字\s*  # 可选的空白字符\w+  # 匹配单词", RegexOptions.IgnorePatternWhitespace);// 编译正则表达式以提高性能Regex compiled = new Regex(@"\d+", RegexOptions.Compiled);}
}

2. 正则表达式语法

2.1 字符匹配

public class CharacterMatching
{public void MatchingExamples(){string text = "C# 10.0 is awesome! Price: $99.99";// 匹配数字Regex digits = new Regex(@"\d+");foreach (Match m in digits.Matches(text)){Console.WriteLine($"Number: {m.Value}");}// 匹配单词Regex words = new Regex(@"\w+");var wordMatches = words.Matches(text).Cast<Match>().Select(m => m.Value).ToList();// 匹配空白字符string[] parts = Regex.Split(text, @"\s+");// 自定义字符类Regex vowels = new Regex(@"[aeiou]", RegexOptions.IgnoreCase);var vowelMatches = vowels.Matches(text).Cast<Match>().Select(m => m.Value).ToList();}
}

2.2 分组和捕获

public class GroupingExample
{public void GroupExamples(){string text = "John Smith, Jane Doe, Bob Johnson";// 基本分组Regex regex = new Regex(@"(\w+)\s(\w+)");foreach (Match match in regex.Matches(text)){Console.WriteLine($"Full name: {match.Groups[0].Value}");Console.WriteLine($"First name: {match.Groups[1].Value}");Console.WriteLine($"Last name: {match.Groups[2].Value}");}// 命名分组Regex namedRegex = new Regex(@"(?<first>\w+)\s(?<last>\w+)");foreach (Match match in namedRegex.Matches(text)){Console.WriteLine($"First: {match.Groups["first"].Value}");Console.WriteLine($"Last: {match.Groups["last"].Value}");}}
}

3. 高级特性

3.1 替换操作

public class ReplacementOperations
{public string ReplaceExample(string text){// 简单替换string result1 = Regex.Replace(text, @"\d+", "X");// 使用MatchEvaluator委托string result2 = Regex.Replace(text, @"\d+", match =>{int number = int.Parse(match.Value);return (number * 2).ToString();});// 使用命名组的替换Regex regex = new Regex(@"(?<first>\w+)\s(?<last>\w+)");string result3 = regex.Replace(text, "${last}, ${first}");return result3;}
}

3.2 前瞻和后顾

public class LookAroundExample
{public void LookAroundDemo(){string text = "Price: $100, Cost: $50";// 正向前瞻Regex positiveAhead = new Regex(@"\d+(?=\s*dollars)");// 负向前瞻Regex negativeAhead = new Regex(@"\d+(?!\s*dollars)");// 正向后顾Regex positiveBehind = new Regex(@"(?<=\$)\d+");// 负向后顾Regex negativeBehind = new Regex(@"(?<!\$)\d+");}
}

4. 实用工具类

4.1 验证器

public class Validator
{private static readonly Regex EmailRegex = new Regex(@"^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$",RegexOptions.Compiled);private static readonly Regex PhoneRegex = new Regex(@"^1[3-9]\d{9}$",RegexOptions.Compiled);private static readonly Regex PasswordRegex = new Regex(@"^(?=.*[A-Za-z])(?=.*\d)[A-Za-z\d]{8,}$",RegexOptions.Compiled);public static bool IsValidEmail(string email){if (string.IsNullOrEmpty(email)) return false;return EmailRegex.IsMatch(email);}public static bool IsValidPhone(string phone){if (string.IsNullOrEmpty(phone)) return false;return PhoneRegex.IsMatch(phone);}public static bool IsValidPassword(string password){if (string.IsNullOrEmpty(password)) return false;return PasswordRegex.IsMatch(password);}
}

4.2 文本处理器

public class TextProcessor
{private static readonly Regex UrlRegex = new Regex(@"https?://(?:[-\w.]|(?:%[\da-fA-F]{2}))+[^\s]*",RegexOptions.Compiled);private static readonly Regex HtmlTagRegex = new Regex(@"<[^>]+>",RegexOptions.Compiled);public static IEnumerable<string> ExtractUrls(string text){if (string.IsNullOrEmpty(text)) return Enumerable.Empty<string>();return UrlRegex.Matches(text).Cast<Match>().Select(m => m.Value);}public static string StripHtmlTags(string html){if (string.IsNullOrEmpty(html)) return string.Empty;return HtmlTagRegex.Replace(html, string.Empty);}public static string CleanWhitespace(string text){if (string.IsNullOrEmpty(text)) return string.Empty;return Regex.Replace(text.Trim(), @"\s+", " ");}
}

5. 性能优化

5.1 静态编译正则表达式

public class RegexOptimization
{// 使用静态字段存储编译后的正则表达式private static readonly Regex CompiledRegex = new Regex(@"\d+",RegexOptions.Compiled);// 使用Lazy<T>延迟初始化private static readonly Lazy<Regex> LazyRegex = new Lazy<Regex>(() => new Regex(@"\d+", RegexOptions.Compiled));public void OptimizedExample(){// 使用编译后的正则表达式bool isMatch = CompiledRegex.IsMatch("123");// 使用延迟初始化的正则表达式bool lazyMatch = LazyRegex.Value.IsMatch("123");}
}

5.2 性能考虑

public class PerformanceConsiderations
{// 1. 使用适当的选项private static readonly Regex FastRegex = new Regex(@"\d+",RegexOptions.Compiled | RegexOptions.ExplicitCapture);// 2. 避免过度使用通配符private static readonly Regex BetterRegex = new Regex(@"[^/]*foo[^/]*",  // 比 .*foo.* 更高效RegexOptions.Compiled);// 3. 使用非捕获组private static readonly Regex NonCapturingRegex = new Regex(@"(?:\d+)(?:[a-z]+)",  // 使用(?:)表示非捕获组RegexOptions.Compiled);
}

6. 异常处理

public class RegexExceptionHandling
{public static Regex CreateSafeRegex(string pattern){try{return new Regex(pattern, RegexOptions.Compiled);}catch (ArgumentException ex){throw new ArgumentException($"Invalid regex pattern: {ex.Message}", ex);}}public static bool SafeIsMatch(string input, string pattern){try{return Regex.IsMatch(input, pattern);}catch (RegexMatchTimeoutException ex){Console.WriteLine($"Regex matching timed out: {ex.Message}");return false;}catch (ArgumentException ex){Console.WriteLine($"Invalid regex pattern: {ex.Message}");return false;}}
}

7. 单元测试

[TestClass]
public class ValidatorTests
{[TestMethod]public void TestEmailValidation(){Assert.IsTrue(Validator.IsValidEmail("test@example.com"));Assert.IsTrue(Validator.IsValidEmail("user@domain.co.uk"));Assert.IsFalse(Validator.IsValidEmail("invalid.email"));Assert.IsFalse(Validator.IsValidEmail("@domain.com"));}[TestMethod]public void TestPhoneValidation(){Assert.IsTrue(Validator.IsValidPhone("13812345678"));Assert.IsFalse(Validator.IsValidPhone("12345678"));Assert.IsFalse(Validator.IsValidPhone("2381234567"));}[TestMethod]public void TestTextProcessing(){string html = "<p>Hello</p><div>World</div>";Assert.AreEqual("HelloWorld",TextProcessor.StripHtmlTags(html));string text = "  multiple   spaces   here  ";Assert.AreEqual("multiple spaces here",TextProcessor.CleanWhitespace(text));}
}

总结

C#的正则表达式实现具有以下特点:

  1. 强大的Regex类支持
  2. 编译选项提供高性能
  3. LINQ集成
  4. 完整的Unicode支持

最佳实践:

  1. 使用静态编译的Regex对象提高性能
  2. 合理使用RegexOptions
  3. 处理超时和异常情况
  4. 编写完整的单元测试
  5. 使用命名捕获组提高可读性

注意事项:

  1. Regex对象创建开销大,应该重用
  2. 考虑使用Compiled选项提高性能
  3. 处理RegexMatchTimeoutException
  4. 注意内存使用

记住:在C#中使用正则表达式时,要充分利用.NET框架提供的功能,如编译选项和LINQ集成。合理使用静态编译和缓存可以显著提高性能。

相关文章:

C# 正则表达式完全指南

C# 正则表达式完全指南 C#通过 System.Text.RegularExpressions 命名空间提供强大的正则表达式支持。本指南将详细介绍C#中正则表达式的使用方法、性能优化和最佳实践。 1. 基础知识 1.1 命名空间导入 using System.Text.RegularExpressions;1.2 基本使用 public class Re…...

【笔记整理】记录参加骁龙AIPC开发者技术沙龙的笔记

AIoT 首先了解了一个概念叫AIoT&#xff0c;我的理解就是AI IoT 5G&#xff0c;通过AI的发展使得边缘计算、数据整合和处理变得快捷方便&#xff0c;不仅限于传统的云端数据处理&#xff0c;在边缘的IoT设备上也可以进行智能化打造&#xff0c;通过5G的通信能力扩展可以实现…...

论文解析 | 基于语言模型的自主代理调查

论文 《A Survey on Large Language Model-based Autonomous Agents》 对基于大型语言模型&#xff08;LLM&#xff09;的自主智能体&#xff08;Autonomous Agents&#xff09;进行了全面调查。随着大型语言模型&#xff08;如 GPT 系列、BERT、T5 等&#xff09;的快速发展&a…...

面试加分项:Android Framework AMS 全面概述和知识要点

第一章:AMS 的架构与组件 1.1 AMS 整体架构 在 Android 系统的庞大体系中,AMS(Activity Manager Service)就如同一个中枢神经系统,是整个系统的核心服务之一,对应用的性能和用户体验有着直接且关键的影响 。它的整体架构由 Client 端和 Service 端两大部分组成,这两端相…...

EasyCVR视频汇聚平台如何配置webrtc播放地址?

EasyCVR安防监控视频系统采用先进的网络传输技术&#xff0c;支持高清视频的接入和传输&#xff0c;能够满足大规模、高并发的远程监控需求。平台支持多协议接入&#xff0c;能将接入到视频流转码为多格式进行分发&#xff0c;包括RTMP、RTSP、HTTP-FLV、WebSocket-FLV、HLS、W…...

用户界面软件04

后果 使用这种架构很容易对两个层面的非功能性需求进行优化&#xff0c;但是你仍然需要小心不要将功能 需求重复实现。 现在&#xff0c;两个层面可能有完全不同的设计。比如&#xff0c;用户界面层可能使用配件模型&#xff08;Widget Model&#xff09;&#xff0c; 以大量的…...

C#,数值计算,矩阵相乘的斯特拉森(Strassen’s Matrix Multiplication)分治算法与源代码

Volker Strassen 1 矩阵乘法 矩阵乘法是机器学习中最基本的运算之一&#xff0c;对其进行优化是多种优化的关键。通常&#xff0c;将两个大小为N X N的矩阵相乘需要N^3次运算。从那以后&#xff0c;我们在更好、更聪明的矩阵乘法算法方面取得了长足的进步。沃尔克斯特拉森于1…...

linux:文件的创建/删除/复制/移动/查看/查找/权限/类型/压缩/打包

关于文件的关键词 创建 touch 删除 rm 复制 cp 权限 chmod 移动 mv 查看内容 cat(全部); head(前10行); tail(末尾10行); more,less 查找 find 压缩 gzip ; bzip 打包 tar 编辑 sed 创建文件 格式&#xff1a; touch 文件名 删除文件 复制文件 移动文件 查看文…...

SQL Server查询计划操作符——查询计划相关操作符(3)

7.3. 查询计划相关操作符 19)Collapse:该操作符对更改处理进行优化。当执行一个更改时,其能被劈成(用Split操作符)一个删除和一个插入。其参数列包含一个确定一系列键值字段的GROUP BY:()子句。如果查询处理器遇到删除和插入相同键值的毗邻行,其将用一个更高效的更改操作…...

【Notepad++】Notepad++如何删除包含某个字符串所在的行

Notepad如何删除包含某个字符串所在的行 一&#xff0c;简介二&#xff0c;操作方法三&#xff0c;总结 一&#xff0c;简介 在使用beyoundcompare软件进行对比的时候&#xff0c;常常会出现一些无关紧要的地方&#xff0c;且所在行的内容是变化的&#xff0c;不方便进行比较&…...

Android 来电白名单 只允许联系人呼入电话

客户需求只允许通讯录中联系人可以呼入电话。参考自带的黑名单实现 CallsManager.java类中的onSuccessfulIncomingCall方法有一些过滤器&#xff0c;可以仿照黑名单的方式添加自己的过滤器。 packages/services/Telecomm/src/com/android/server/telecom/CallsManager.java …...

【计算机网络】lab3 802.11 (无线网络帧)

&#x1f308; 个人主页&#xff1a;十二月的猫-CSDN博客 &#x1f525; 系列专栏&#xff1a; &#x1f3c0;计算机网络_十二月的猫的博客-CSDN博客 &#x1f4aa;&#x1f3fb; 十二月的寒冬阻挡不了春天的脚步&#xff0c;十二点的黑夜遮蔽不住黎明的曙光 目录 1. 前言 2.…...

单片机(MCU)-简单认识

简介&#xff1a; 内部集成了CPU&#xff0c;RAM&#xff0c;ROM&#xff0c;定时器&#xff0c;中断系统&#xff0c;通讯接口等一系列电脑的常用硬件功能。 单片机的任务是信息采集&#xff08;依靠传感器&#xff09;&#xff0c;处理&#xff08;依靠CPU&#xff09;&…...

全面教程:Nacos 2.3.2 启用鉴权与 MySQL 数据存储配置

全面教程&#xff1a;Nacos 2.3.2 启用鉴权与 MySQL 数据存储配置 1. 配置 Nacos 开启鉴权功能 1.1 修改 application.properties 配置文件 在 Nacos 2.3.2 中&#xff0c;开启鉴权功能需要修改 conf/application.properties 文件。按照以下方式配置&#xff1a; # 开启鉴权…...

软件23种设计模式完整版[附Java版示例代码]

一、什么是设计模式 设计模式是在软件设计中反复出现的问题的通用解决方案。它们是经过多次验证和应用的指导原则,旨在帮助软件开发人员解决特定类型的问题,提高代码的可维护性、可扩展性和重用性。 设计模式是一种抽象化的思维方式,可以帮助开发人员更好地组织和设计他们…...

国标GB28181-2022视频平台EasyGBS小知识:局域网ip地址不够用怎么解决?

在局域网中&#xff0c;IP地址不足的问题通常不会在小型网络中出现&#xff0c;但在拥有超过255台设备的大型局域网中&#xff0c;就需要考虑如何解决IP地址不够用的问题了。 在企业局域网中&#xff0c;经常会出现私有IP地址如192.168.1.x到192.168.1.255不够用的情况。由于0…...

PHP 循环控制结构深度剖析:从基础到实战应用

PHP 循环控制结构深度剖析&#xff1a;从基础到实战应用 PHP提供了多种控制结构&#xff0c;其中循环控制结构是最常见的结构之一。它们使得我们能够高效地重复执行一段代码&#xff0c;直到满足某个条件为止。本文将从PHP循环的基础知识出发&#xff0c;逐步分析其在实际项目…...

vue的属性绑定

重建一个新的项目 App.vue main.js HelloWorld.vue 属性绑定 双大括号不能在 HTML attributes 中使用。想要响应式地绑定一个 attribute&#xff0c;应该使用 v-bind 指令 <template><div v-bind:id"dynamicId" v-bind:class"dynamicClass">…...

FFmpeg音视频流媒体,视频编解码性能优化

你是不是也有过这样一个疑问&#xff1a;视频如何从一个简单的文件变成你手机上快速播放的短片&#xff0c;或者是那种占满大屏幕的超高清大片&#xff1f;它背后的法宝&#xff0c;离不开一个神奇的工具——FFmpeg&#xff01;说它强大&#xff0c;完全不为过&#xff0c;它在…...

16_Redis Lua脚本

Redis Lua脚本是Redis提供的一种强大的扩展机制。 1.Redis Lua脚本介绍 1.1 基本概念 Redis Lua脚本允许开发者将一段Lua语言编写的代码发送给Redis服务器执行。这项功能自Redis 2.6版本引入以来,为用户提供了强大的灵活性和扩展能力,使得可以在Redis内部直接处理复杂的业…...

新手也能懂的SSRF漏洞实战:用iwebsec靶场复现文件读取与内网探测

从零开始掌握SSRF漏洞&#xff1a;iwebsec靶场实战指南1. 认识SSRF漏洞的本质想象一下&#xff0c;你正在一家高档餐厅点餐&#xff0c;服务员承诺可以帮你从任何地方获取食材——包括隔壁竞争对手的厨房。SSRF&#xff08;Server-Side Request Forgery&#xff09;漏洞就像这个…...

告别网盘客户端!用Alist+RaiDrive把百度云盘变成电脑本地文件夹(保姆级图文教程)

用AlistRaiDrive实现网盘本地化管理的终极方案 你是否厌倦了电脑上安装多个网盘客户端&#xff0c;不仅占用系统资源&#xff0c;操作还繁琐割裂&#xff1f;每次上传下载文件都要在不同客户端间切换&#xff0c;效率低下。现在&#xff0c;通过Alist和RaiDrive的组合&#xf…...

Veo 2胶片质感生成器失效?——深度解析Color Science v2.3内核中被屏蔽的Cinematic Grain Injection层

更多请点击&#xff1a; https://kaifayun.com 第一章&#xff1a;Veo 2胶片质感生成器失效现象全景透视 近期大量用户反馈&#xff0c;Veo 2 胶片质感生成器在调用 generate_film_effect() 接口后返回空纹理、纯灰帧或 HTTP 503 Service Unavailable 错误&#xff0c;且该问题…...

关联规则挖掘在Calabi-Yau流形Hodge数分析中的应用与复现

1. 项目概述&#xff1a;当数据挖掘遇见高维几何在理论物理和代数几何的交叉领域&#xff0c;Calabi-Yau流形一直扮演着核心角色。这些具有特殊拓扑结构的空间&#xff0c;不仅是弦理论中额外维度紧化的关键候选者&#xff0c;其本身丰富的数学性质也吸引着无数研究者。然而&am…...

对比自行维护多个 API 源,使用 Taotoken 聚合服务在运维复杂度上的降低

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 对比自行维护多个 API 源&#xff0c;使用 Taotoken 聚合服务在运维复杂度上的降低 在构建依赖多个大语言模型的应用时&#xff0c…...

三步让小爱音箱秒变AI语音助手:MiGPT深度配置指南

三步让小爱音箱秒变AI语音助手&#xff1a;MiGPT深度配置指南 【免费下载链接】mi-gpt &#x1f3e0; 将小爱音箱接入 ChatGPT 和豆包&#xff0c;改造成你的专属语音助手。 项目地址: https://gitcode.com/GitHub_Trending/mi/mi-gpt 还在为小爱音箱的"人工智障&q…...

CentOS 8.5最小化安装后,这5个必做的安全与效率优化设置(附一键脚本)

CentOS 8.5最小化安装后的5个必做安全与效率优化刚完成CentOS 8.5最小化安装的系统就像一张白纸——干净但缺乏生产力。作为运维老手&#xff0c;我见过太多人跳过基础优化直接部署应用&#xff0c;结果在后续使用中频繁遇到权限混乱、软件安装慢、SSH爆破等问题。本文将分享我…...

别再瞎拖拽了!Unity Prefab从创建到批量修改的保姆级工作流(含变体与嵌套实战)

Unity Prefab高效工作流&#xff1a;从创建到批量修改的实战指南在Unity项目开发中&#xff0c;Prefab&#xff08;预制体&#xff09;是最基础也最强大的工具之一。但很多开发者&#xff0c;尤其是初学者&#xff0c;往往停留在简单的"拖拽-修改"阶段&#xff0c;没…...

Claude Agent SDK 从 0 到 1 快速上手教程

Claude Agent SDK 从 0 到 1 快速上手教程 什么是 Claude Agent SDK? Claude Agent SDK 是 Anthropic 官方推出的用于构建 AI 智能体的开发工具包。它基于 Claude Code 构建,让开发者能够以编程方式创建、扩展和定制由 Claude 驱动的应用程序。与简单的聊天机器人不同,基于…...

告别依赖冲突:在Debian12上为特定项目搭建Python2.7.18独立运行环境

告别依赖冲突&#xff1a;在Debian12上为特定项目搭建Python2.7.18独立运行环境 当现代Linux系统已全面拥抱Python3的时代&#xff0c;突然需要维护一个仅支持Python2.7的遗留项目&#xff0c;这种场景对开发者而言无异于一场噩梦。本文将带你用工程化的思维&#xff0c;在Deb…...