跳转到内容
主菜单
主菜单
移至侧栏
隐藏
导航
首页
最近更改
随机页面
MediaWiki帮助
代码酷
搜索
搜索
中文(中国大陆)
外观
创建账号
登录
个人工具
创建账号
登录
未登录编辑者的页面
了解详情
贡献
讨论
编辑“︁
C Sharp 正则表达式
”︁(章节)
页面
讨论
大陆简体
阅读
编辑
编辑源代码
查看历史
工具
工具
移至侧栏
隐藏
操作
阅读
编辑
编辑源代码
查看历史
常规
链入页面
相关更改
特殊页面
页面信息
外观
移至侧栏
隐藏
您的更改会在有权核准的用户核准后向读者展示。
警告:
您没有登录。如果您进行任何编辑,您的IP地址会公开展示。如果您
登录
或
创建账号
,您的编辑会以您的用户名署名,此外还有其他益处。
反垃圾检查。
不要
加入这个!
= C#正则表达式 = 正则表达式(Regular Expression,简称Regex)是一种强大的文本处理工具,用于在字符串中搜索、匹配和替换符合特定模式的文本。在C#中,正则表达式通过'''System.Text.RegularExpressions'''命名空间提供支持,是处理复杂字符串操作的利器。 == 基本概念 == 正则表达式由一系列字符和特殊符号组成,用于定义搜索模式。以下是核心概念: * '''字面字符''':普通字符(如'a','1')直接匹配自身 * '''元字符''':具有特殊含义的字符(如<code>.</code>, <code>*</code>, <code>+</code>, <code>?</code>) * '''字符类''':用方括号定义(如<code>[a-z]</code>匹配任意小写字母) * '''量词''':指定匹配次数(如<code>{3}</code>表示精确匹配3次) === 正则表达式引擎 === C#使用回溯型正则表达式引擎,其工作流程如下: <mermaid> graph TD A[输入字符串] --> B(模式匹配) B --> C{匹配成功?} C -->|是| D[返回匹配结果] C -->|否| E[尝试其他可能性] E --> B </mermaid> == 基础语法 == 以下是常见元字符及其含义: {| class="wikitable" ! 元字符 !! 描述 !! 示例 |- | <code>.</code> || 匹配任意单个字符(除换行符) || <code>a.c</code>匹配"abc","a1c" |- | <code>\d</code> || 匹配数字(等价于<code>[0-9]</code>) || <code>\d\d</code>匹配"42" |- | <code>\w</code> || 匹配单词字符(字母、数字、下划线) || <code>\w+</code>匹配"hello_123" |- | <code>\s</code> || 匹配空白字符(空格、制表符等) || <code>\s\w</code>匹配" a" |- | <code>^</code> || 匹配字符串开始位置 || <code>^\d</code>匹配"3apples"中的"3" |- | <code>$</code> || 匹配字符串结束位置 || <code>\.$</code>匹配"end."中的"." |} == C#中的实现 == C#提供'''Regex'''类处理正则表达式,主要方法包括: === 基本匹配 === <syntaxhighlight lang="csharp"> using System; using System.Text.RegularExpressions; class Program { static void Main() { string pattern = @"\d+"; // 匹配一个或多个数字 string input = "Order 12345 placed"; Match match = Regex.Match(input, pattern); if (match.Success) { Console.WriteLine($"Matched: {match.Value}"); // 输出: Matched: 12345 } } } </syntaxhighlight> === 常见操作 === {| class="wikitable" ! 方法 !! 描述 !! 示例 |- | '''IsMatch''' || 检查是否匹配 || <code>Regex.IsMatch("123", @"\d+")</code> → true |- | '''Match''' || 返回第一个匹配 || <code>Regex.Match("a1 b2", @"\d").Value</code> → "1" |- | '''Matches''' || 返回所有匹配 || <code>Regex.Matches("a1 b2", @"\d").Count</code> → 2 |- | '''Replace''' || 替换匹配文本 || <code>Regex.Replace("a1", @"\d", "2")</code> → "a2" |- | '''Split''' || 按模式分割字符串 || <code>Regex.Split("a1b2", @"\d")</code> → ["a","b",""] |} == 分组与捕获 == 圆括号<code>()</code>创建捕获组,可提取子匹配: <syntaxhighlight lang="csharp"> string pattern = @"(\w+)@(\w+\.\w+)"; string email = "user@example.com"; Match m = Regex.Match(email, pattern); if (m.Success) { Console.WriteLine($"Username: {m.Groups[1].Value}"); // user Console.WriteLine($"Domain: {m.Groups[2].Value}"); // example.com } </syntaxhighlight> == 实际应用案例 == === 案例1:验证电子邮件格式 === <syntaxhighlight lang="csharp"> bool IsValidEmail(string email) { string pattern = @"^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$"; return Regex.IsMatch(email, pattern); } Console.WriteLine(IsValidEmail("test@example.com")); // true Console.WriteLine(IsValidEmail("invalid.email")); // false </syntaxhighlight> === 案例2:提取日志信息 === <syntaxhighlight lang="csharp"> string logEntry = "[2023-04-01 14:30:22] ERROR: File not found"; string pattern = @"^\[(.+?)\]\s+(\w+):\s+(.+)$"; Match m = Regex.Match(logEntry, pattern); if (m.Success) { Console.WriteLine($"Timestamp: {m.Groups[1].Value}"); Console.WriteLine($"Log Level: {m.Groups[2].Value}"); Console.WriteLine($"Message: {m.Groups[3].Value}"); } </syntaxhighlight> 输出: <pre> Timestamp: 2023-04-01 14:30:22 Log Level: ERROR Message: File not found </pre> == 性能优化 == * 预编译正则表达式:使用<code>RegexOptions.Compiled</code> * 重用Regex对象:避免重复创建 * 避免过度回溯:使用原子组<code>(?>...)</code>或占有量词<code>?+</code>, <code>*+</code>, <code>++</code> <syntaxhighlight lang="csharp"> // 预编译示例 Regex precompiledRegex = new Regex(@"\d{4}-\d{2}-\d{2}", RegexOptions.Compiled | RegexOptions.IgnoreCase); </syntaxhighlight> == 高级主题 == === 零宽断言 === {| class="wikitable" ! 断言 !! 描述 !! 示例 |- | <code>(?=...)</code> || 正向先行断言 || <code>\w+(?=!)</code>匹配"hello!"中的"hello" |- | <code>(?!...)</code> || 负向先行断言 || <code>\d{3}(?!\d)</code>匹配"123a"中的"123" |- | <code>(?<=...)</code> || 正向后行断言 || <code>(?<=\$)\d+</code>匹配"$100"中的"100" |- | <code>(?<!...)</code> || 负向后行断言 || <code>(?<!-)\d+</code>匹配"1-2"中的"1" |} === 平衡组 === 用于匹配嵌套结构(如括号): <syntaxhighlight lang="csharp"> string nested = "(a(b)c)"; string pattern = @"(?<open>\(|\[)+(?<content>[^\(\)\[\]]+)(?<close-open>\)|\])+"; MatchCollection mc = Regex.Matches(nested, pattern); foreach (Match m in mc) { Console.WriteLine(m.Groups["content"].Value); // 输出: b } </syntaxhighlight> == 常见问题 == '''Q: 何时应该使用正则表达式?''' * 适合:模式匹配、文本提取、复杂替换 * 不适合:XML/HTML解析、语法分析、简单字符串操作 '''Q: 如何调试复杂的正则表达式?''' * 使用在线测试工具(如regex101.com) * 分解复杂模式为多个简单部分 * 启用<code>RegexOptions.IgnorePatternWhitespace</code>添加注释 == 数学表示 == 正则表达式可以形式化为: <math> R ::= \emptyset | \epsilon | a | R \cdot R | R \cup R | R^* </math> 其中: * <math>\emptyset</math>:空语言 * <math>\epsilon</math>:空字符串 * <math>a</math>:字母表中的字符 * <math>\cdot</math>:连接运算 * <math>\cup</math>:并运算 * <math>*</math>:Kleene星号 == 总结 == 正则表达式是C#中处理字符串的强大工具,通过本指南您已经学习了: * 基础语法和元字符 * C#中Regex类的使用方法 * 实际应用案例 * 性能优化技巧 * 高级特性如零宽断言 掌握正则表达式将显著提升您的文本处理能力,但需注意合理使用,避免过度复杂的模式影响可读性和性能。 [[Category:编程语言]] [[Category:C Sharp]] [[Category:C Sharp 字符串]]
摘要:
请注意,所有对代码酷的贡献均被视为依照知识共享署名-非商业性使用-相同方式共享发表(详情请见
代码酷:著作权
)。如果您不希望您的文字作品被随意编辑和分发传播,请不要在此提交。
您同时也向我们承诺,您提交的内容为您自己所创作,或是复制自公共领域或类似自由来源。
未经许可,请勿提交受著作权保护的作品!
取消
编辑帮助
(在新窗口中打开)