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#的正则表达式实现具有以下特点:
- 强大的Regex类支持
- 编译选项提供高性能
- LINQ集成
- 完整的Unicode支持
最佳实践:
- 使用静态编译的Regex对象提高性能
- 合理使用RegexOptions
- 处理超时和异常情况
- 编写完整的单元测试
- 使用命名捕获组提高可读性
注意事项:
- Regex对象创建开销大,应该重用
- 考虑使用Compiled选项提高性能
- 处理RegexMatchTimeoutException
- 注意内存使用
记住:在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,我的理解就是AI IoT 5G,通过AI的发展使得边缘计算、数据整合和处理变得快捷方便,不仅限于传统的云端数据处理,在边缘的IoT设备上也可以进行智能化打造,通过5G的通信能力扩展可以实现…...
论文解析 | 基于语言模型的自主代理调查
论文 《A Survey on Large Language Model-based Autonomous Agents》 对基于大型语言模型(LLM)的自主智能体(Autonomous Agents)进行了全面调查。随着大型语言模型(如 GPT 系列、BERT、T5 等)的快速发展&a…...
面试加分项:Android Framework AMS 全面概述和知识要点
第一章:AMS 的架构与组件 1.1 AMS 整体架构 在 Android 系统的庞大体系中,AMS(Activity Manager Service)就如同一个中枢神经系统,是整个系统的核心服务之一,对应用的性能和用户体验有着直接且关键的影响 。它的整体架构由 Client 端和 Service 端两大部分组成,这两端相…...
EasyCVR视频汇聚平台如何配置webrtc播放地址?
EasyCVR安防监控视频系统采用先进的网络传输技术,支持高清视频的接入和传输,能够满足大规模、高并发的远程监控需求。平台支持多协议接入,能将接入到视频流转码为多格式进行分发,包括RTMP、RTSP、HTTP-FLV、WebSocket-FLV、HLS、W…...
用户界面软件04
后果 使用这种架构很容易对两个层面的非功能性需求进行优化,但是你仍然需要小心不要将功能 需求重复实现。 现在,两个层面可能有完全不同的设计。比如,用户界面层可能使用配件模型(Widget Model), 以大量的…...
C#,数值计算,矩阵相乘的斯特拉森(Strassen’s Matrix Multiplication)分治算法与源代码
Volker Strassen 1 矩阵乘法 矩阵乘法是机器学习中最基本的运算之一,对其进行优化是多种优化的关键。通常,将两个大小为N X N的矩阵相乘需要N^3次运算。从那以后,我们在更好、更聪明的矩阵乘法算法方面取得了长足的进步。沃尔克斯特拉森于1…...
linux:文件的创建/删除/复制/移动/查看/查找/权限/类型/压缩/打包
关于文件的关键词 创建 touch 删除 rm 复制 cp 权限 chmod 移动 mv 查看内容 cat(全部); head(前10行); tail(末尾10行); more,less 查找 find 压缩 gzip ; bzip 打包 tar 编辑 sed 创建文件 格式: touch 文件名 删除文件 复制文件 移动文件 查看文…...
SQL Server查询计划操作符——查询计划相关操作符(3)
7.3. 查询计划相关操作符 19)Collapse:该操作符对更改处理进行优化。当执行一个更改时,其能被劈成(用Split操作符)一个删除和一个插入。其参数列包含一个确定一系列键值字段的GROUP BY:()子句。如果查询处理器遇到删除和插入相同键值的毗邻行,其将用一个更高效的更改操作…...
【Notepad++】Notepad++如何删除包含某个字符串所在的行
Notepad如何删除包含某个字符串所在的行 一,简介二,操作方法三,总结 一,简介 在使用beyoundcompare软件进行对比的时候,常常会出现一些无关紧要的地方,且所在行的内容是变化的,不方便进行比较&…...
Android 来电白名单 只允许联系人呼入电话
客户需求只允许通讯录中联系人可以呼入电话。参考自带的黑名单实现 CallsManager.java类中的onSuccessfulIncomingCall方法有一些过滤器,可以仿照黑名单的方式添加自己的过滤器。 packages/services/Telecomm/src/com/android/server/telecom/CallsManager.java …...
【计算机网络】lab3 802.11 (无线网络帧)
🌈 个人主页:十二月的猫-CSDN博客 🔥 系列专栏: 🏀计算机网络_十二月的猫的博客-CSDN博客 💪🏻 十二月的寒冬阻挡不了春天的脚步,十二点的黑夜遮蔽不住黎明的曙光 目录 1. 前言 2.…...
单片机(MCU)-简单认识
简介: 内部集成了CPU,RAM,ROM,定时器,中断系统,通讯接口等一系列电脑的常用硬件功能。 单片机的任务是信息采集(依靠传感器),处理(依靠CPU)&…...
全面教程:Nacos 2.3.2 启用鉴权与 MySQL 数据存储配置
全面教程:Nacos 2.3.2 启用鉴权与 MySQL 数据存储配置 1. 配置 Nacos 开启鉴权功能 1.1 修改 application.properties 配置文件 在 Nacos 2.3.2 中,开启鉴权功能需要修改 conf/application.properties 文件。按照以下方式配置: # 开启鉴权…...
软件23种设计模式完整版[附Java版示例代码]
一、什么是设计模式 设计模式是在软件设计中反复出现的问题的通用解决方案。它们是经过多次验证和应用的指导原则,旨在帮助软件开发人员解决特定类型的问题,提高代码的可维护性、可扩展性和重用性。 设计模式是一种抽象化的思维方式,可以帮助开发人员更好地组织和设计他们…...
国标GB28181-2022视频平台EasyGBS小知识:局域网ip地址不够用怎么解决?
在局域网中,IP地址不足的问题通常不会在小型网络中出现,但在拥有超过255台设备的大型局域网中,就需要考虑如何解决IP地址不够用的问题了。 在企业局域网中,经常会出现私有IP地址如192.168.1.x到192.168.1.255不够用的情况。由于0…...
PHP 循环控制结构深度剖析:从基础到实战应用
PHP 循环控制结构深度剖析:从基础到实战应用 PHP提供了多种控制结构,其中循环控制结构是最常见的结构之一。它们使得我们能够高效地重复执行一段代码,直到满足某个条件为止。本文将从PHP循环的基础知识出发,逐步分析其在实际项目…...
vue的属性绑定
重建一个新的项目 App.vue main.js HelloWorld.vue 属性绑定 双大括号不能在 HTML attributes 中使用。想要响应式地绑定一个 attribute,应该使用 v-bind 指令 <template><div v-bind:id"dynamicId" v-bind:class"dynamicClass">…...
FFmpeg音视频流媒体,视频编解码性能优化
你是不是也有过这样一个疑问:视频如何从一个简单的文件变成你手机上快速播放的短片,或者是那种占满大屏幕的超高清大片?它背后的法宝,离不开一个神奇的工具——FFmpeg!说它强大,完全不为过,它在…...
16_Redis Lua脚本
Redis Lua脚本是Redis提供的一种强大的扩展机制。 1.Redis Lua脚本介绍 1.1 基本概念 Redis Lua脚本允许开发者将一段Lua语言编写的代码发送给Redis服务器执行。这项功能自Redis 2.6版本引入以来,为用户提供了强大的灵活性和扩展能力,使得可以在Redis内部直接处理复杂的业…...
网络六边形受到攻击
大家读完觉得有帮助记得关注和点赞!!! 抽象 现代智能交通系统 (ITS) 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 (…...
Debian系统简介
目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版ÿ…...
基础测试工具使用经验
背景 vtune,perf, nsight system等基础测试工具,都是用过的,但是没有记录,都逐渐忘了。所以写这篇博客总结记录一下,只要以后发现新的用法,就记得来编辑补充一下 perf 比较基础的用法: 先改这…...
高危文件识别的常用算法:原理、应用与企业场景
高危文件识别的常用算法:原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件,如包含恶意代码、敏感数据或欺诈内容的文档,在企业协同办公环境中(如Teams、Google Workspace)尤为重要。结合大模型技术&…...
Neo4j 集群管理:原理、技术与最佳实践深度解析
Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...
Spring AI 入门:Java 开发者的生成式 AI 实践之路
一、Spring AI 简介 在人工智能技术快速迭代的今天,Spring AI 作为 Spring 生态系统的新生力量,正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务(如 OpenAI、Anthropic)的无缝对接&…...
EtherNet/IP转DeviceNet协议网关详解
一,设备主要功能 疆鸿智能JH-DVN-EIP本产品是自主研发的一款EtherNet/IP从站功能的通讯网关。该产品主要功能是连接DeviceNet总线和EtherNet/IP网络,本网关连接到EtherNet/IP总线中做为从站使用,连接到DeviceNet总线中做为从站使用。 在自动…...
【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统
目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索(基于物理空间 广播范围)2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...
Kubernetes 网络模型深度解析:Pod IP 与 Service 的负载均衡机制,Service到底是什么?
Pod IP 的本质与特性 Pod IP 的定位 纯端点地址:Pod IP 是分配给 Pod 网络命名空间的真实 IP 地址(如 10.244.1.2)无特殊名称:在 Kubernetes 中,它通常被称为 “Pod IP” 或 “容器 IP”生命周期:与 Pod …...
【C++】纯虚函数类外可以写实现吗?
1. 答案 先说答案,可以。 2.代码测试 .h头文件 #include <iostream> #include <string>// 抽象基类 class AbstractBase { public:AbstractBase() default;virtual ~AbstractBase() default; // 默认析构函数public:virtual int PureVirtualFunct…...
