当前位置: 首页 > 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内部直接处理复杂的业…...

QMC5883L的驱动

简介 本篇文章的代码已经上传到了github上面&#xff0c;开源代码 作为一个电子罗盘模块&#xff0c;我们可以通过I2C从中获取偏航角yaw&#xff0c;相对于六轴陀螺仪的yaw&#xff0c;qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...

Java - Mysql数据类型对应

Mysql数据类型java数据类型备注整型INT/INTEGERint / java.lang.Integer–BIGINTlong/java.lang.Long–––浮点型FLOATfloat/java.lang.FloatDOUBLEdouble/java.lang.Double–DECIMAL/NUMERICjava.math.BigDecimal字符串型CHARjava.lang.String固定长度字符串VARCHARjava.lang…...

【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)

可以使用Sqliteviz这个网站免费编写sql语句&#xff0c;它能够让用户直接在浏览器内练习SQL的语法&#xff0c;不需要安装任何软件。 链接如下&#xff1a; sqliteviz 注意&#xff1a; 在转写SQL语法时&#xff0c;关键字之间有一个特定的顺序&#xff0c;这个顺序会影响到…...

【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】

1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件&#xff08;System Property Definition File&#xff09;&#xff0c;用于声明和管理 Bluetooth 模块相…...

在Mathematica中实现Newton-Raphson迭代的收敛时间算法(一般三次多项式)

考察一般的三次多项式&#xff0c;以r为参数&#xff1a; p[z_, r_] : z^3 (r - 1) z - r; roots[r_] : z /. Solve[p[z, r] 0, z]&#xff1b; 此多项式的根为&#xff1a; 尽管看起来这个多项式是特殊的&#xff0c;其实一般的三次多项式都是可以通过线性变换化为这个形式…...

站群服务器的应用场景都有哪些?

站群服务器主要是为了多个网站的托管和管理所设计的&#xff0c;可以通过集中管理和高效资源的分配&#xff0c;来支持多个独立的网站同时运行&#xff0c;让每一个网站都可以分配到独立的IP地址&#xff0c;避免出现IP关联的风险&#xff0c;用户还可以通过控制面板进行管理功…...

快刀集(1): 一刀斩断视频片头广告

一刀流&#xff1a;用一个简单脚本&#xff0c;秒杀视频片头广告&#xff0c;还你清爽观影体验。 1. 引子 作为一个爱生活、爱学习、爱收藏高清资源的老码农&#xff0c;平时写代码之余看看电影、补补片&#xff0c;是再正常不过的事。 电影嘛&#xff0c;要沉浸&#xff0c;…...

【Android】Android 开发 ADB 常用指令

查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...

day36-多路IO复用

一、基本概念 &#xff08;服务器多客户端模型&#xff09; 定义&#xff1a;单线程或单进程同时监测若干个文件描述符是否可以执行IO操作的能力 作用&#xff1a;应用程序通常需要处理来自多条事件流中的事件&#xff0c;比如我现在用的电脑&#xff0c;需要同时处理键盘鼠标…...

怎么让Comfyui导出的图像不包含工作流信息,

为了数据安全&#xff0c;让Comfyui导出的图像不包含工作流信息&#xff0c;导出的图像就不会拖到comfyui中加载出来工作流。 ComfyUI的目录下node.py 直接移除 pnginfo&#xff08;推荐&#xff09;​​ 在 save_images 方法中&#xff0c;​​删除或注释掉所有与 metadata …...