C#正则表达式的详细使用说明(附示例代码)
作者:生命不息-学无止境
正则表达式是一种匹配输入文本的模式,Net框架提供了允许这种匹配的正则表达式引擎,模式由一个或多个字符、运算符和结构组成,这篇文章主要介绍了C#正则表达式的详细使用说明,需要的朋友可以参考下
正则表达式基础概念
- 正则表达式是一种用于匹配文本模式的工具。它是由普通字符(例如字母、数字)和特殊字符(称为元字符)组成的字符串模式。在C#中,主要通过
System.Text.RegularExpressions命名空间来使用正则表达式。 - 元字符表格显示:
| 分类 | 正则表达式字符 | 描述 | 示例 |
|---|---|---|---|
| 字符类 | . | 匹配除换行符之外的任意单个字符 | a.b可匹配aab、acb等 |
[abc] | 匹配字符a、b或c中的任意一个 | [abc]可匹配a、b、c中的任意一个字符,如ab[abc]d可匹配abbd、abcd等 | |
[0-9] | 匹配任意一个数字字符,等同于\d | [0-9]可匹配0-9中的任意一个数字,如a1b中的1 | |
[a-z] | 匹配任意一个小写字母字符 | [a-z]可匹配a-z中的任意一个小写字母,如a[abcdef]b可匹配abc、abd等 | |
[^abc] | 匹配除a、b、c之外的任意一个字符 | [^abc]可匹配除a、b、c之外的任意字符,如a1b中的1,a#b中的# | |
| 量词 | * | 匹配前面的元素零次或多次 | ab*可匹配a、ab、abb等 |
+ | 匹配前面的元素一次或多次 | ab+可匹配ab、abb等,但不能匹配a | |
? | 匹配前面的元素零次或一次 | ab?可匹配a或ab | |
{n} | 匹配前面的元素恰好n次 | a{3}可匹配aaa | |
{n,} | 匹配前面的元素至少n次 | a{2,}可匹配aa、aaa等 | |
{n,m} | 匹配前面的元素至少n次且不超过m次 | a{2,4}可匹配aa、aaa、aaaa | |
| 特殊字符 | \d | 匹配任意一个数字字符,等同于[0-9] | \d可匹配0-9中的任意一个数字,如a1b中的1 |
\D | 匹配任意一个非数字字符,等同于[^0-9] | \D可匹配除数字以外的任意字符,如a#b中的a、#、b | |
\w | 匹配任意一个字母、数字或下划线字符,等同于[a-zA-Z0-9_] | \w可匹配a-z、A-Z、0-9、_中的任意一个字符,如a1_b中的a、1、_ | |
\W | 匹配任意一个非字母、数字或下划线字符,等同于[^a-zA-Z0-9_] | \W可匹配除字母、数字、下划线以外的任意字符,如a#b中的# | |
\s | 匹配任意一个空白字符,包括空格、制表符、换页符等 | a\sb可匹配a b,其中中间有一个空格 | |
\S | 匹配任意一个非空白字符 | a\Sb可匹配a#b等,其中#是非空白字符 | |
\b | 匹配一个单词边界 | \bcat\b可匹配单独的单词cat,但不能匹配category中的cat | |
\B | 匹配一个非单词边界 | \Bcat\B可匹配category中的cat,但不能匹配单独的单词cat | |
| 定位符 | ^ | 匹配输入字符串的开始位置 | ^abc可匹配以abc开头的字符串,如abcdef |
$ | 匹配输入字符串的结束位置 | def$可匹配以def结尾的字符串,如abcdef | |
| 转义字符 | \ | 转义特殊字符,使特殊字符按字面意思匹配 | \.可匹配真正的句点字符.,而不是表示任意字符的. |
| 分组与捕获 | (...) | 字符类,匹配括号内的任意一个字符,并将括号内的内容作为一个分组,可以通过Match.Groups获取分组内容 | (abc)可匹配a、b或c中的任意一个字符,如a(abc)d可匹配aabd、aacd等,通过分组可获取匹配到的具体字符 |
| 零宽断言 | (?=...) | 正向肯定预查,用于查找后面跟着特定模式的位置,但不消耗字符 | \d(?=abc)可匹配后面跟着abc的数字,如1abc中的1 |
(?!...) | 正向否定预查,用于查找后面不跟着特定模式的位置,但不消耗字符 | \d(?!abc)可匹配后面不跟着abc的数字,如1def中的1 | |
(?<=...) | 反向肯定预查,用于查找前面跟着特定模式的位置,但不消耗字符 | (?<=def)\d可匹配前面跟着def的数字,如def1中的1 | |
(?<!...) | 反向否定预查,用于查找前面不跟着特定模式的位置,但不消耗字符 | (?<!def)\d可匹配前面不跟着def的数字,如abc1中的1 | |
| 常用方法 | IsMatch | 判断输入字符串是否与正则表达式匹配,返回bool值 | Regex.IsMatch("abc123", @"\d")返回true |
Match | 在输入字符串中查找第一个匹配项,返回Match对象,可通过Match.Value获取匹配的值,Match.Index获取匹配位置等 | Regex.Match("abc123", @"\d")可获取到第一个数字1的相关匹配信息 | |
Matches | 在输入字符串中查找所有匹配项,返回MatchCollection集合,可遍历获取每个匹配项的信息 | Regex.Matches("abc123", @"\d")可获取到所有数字1、2、3的匹配信息 | |
Replace | 将输入字符串中匹配正则表达式的部分替换为指定的字符串 | Regex.Replace("abc123", @"\d", "#")可将abc123替换为abc### | |
Split | 根据正则表达式将输入字符串分割成字符串数组 | Regex.Split("a1b2c3", @"\d")可将字符串分割为{"a", "b", "c"} |
在C#中使用正则表达式的基本步骤
- 引入命名空间:在C#代码中使用正则表达式,首先需要引入
System.Text.RegularExpressions命名空间。例如:
using System.Text.RegularExpressions;
- 创建正则表达式对象:使用
Regex类来创建正则表达式对象。可以通过传递一个正则表达式模式字符串来创建。例如,要匹配一个简单的电话号码格式(假设电话号码是数字,长度为7 - 8位),可以这样创建:
Regex phoneRegex = new Regex(@"^\d{7,8}$");
- 这里
@符号是C#中的逐字字符串字面量,它告诉编译器这个字符串中的转义字符(如\)应该按照字面意思处理,而不是作为C#中的转义字符。^表示匹配字符串的开始,\d表示数字,{7,8}表示前面的元素(数字)出现7到8次,$表示匹配字符串的结束。 - 进行匹配操作:
- 使用IsMatch方法判断是否匹配:例如,判断一个字符串是否是符合上述格式的电话号码。
string phoneNumber = "1234567";
bool isMatch = phoneRegex.IsMatch(phoneNumber);
if (isMatch)
{
Console.WriteLine("是有效的电话号码");
}
else
{
Console.WriteLine("不是有效的电话号码");
}
- 使用Match和Matches方法获取匹配结果:
Match方法返回第一个匹配项。例如,从一段文本中获取第一个符合电子邮件格式的字符串(简单示例)。
string text = "我的邮箱是test@example.com,还有一个无效邮箱abc";
Regex emailRegex = new Regex(@"[a - zA - Z0 - 9_.]+@[a - zA - Z0 - 9_.]+\.[a - zA - Z]+");
Match match = emailRegex.Match(text);
if (match.Success)
{
Console.WriteLine("找到的邮箱是: " + match.Value);
}
Matches方法返回所有匹配项的集合。例如,从一段文本中获取所有的数字。
string numberText = "abc123def456";
Regex numberRegex = new Regex(@"\d+");
MatchCollection matches = numberRegex.Matches(numberText);
foreach (Match match in matches)
{
Console.WriteLine(match.Value);
}
正则表达式的高级用法
- 分组(Grouping):使用括号
()可以将正则表达式的一部分进行分组。分组可以用于提取匹配的特定部分或者在匹配过程中应用量词到一组字符上。例如,在匹配日期格式(假设为yyyy - MM - dd)时,可以这样分组来提取年、月、日。
string dateText = "2024-05-10";
Regex dateRegex = new Regex(@"(\d{4})-(\d{2})-(\d{2})");
Match match = dateRegex.Match(dateText);
if (match.Success)
{
Console.WriteLine("年: " + match.Groups[1].Value);
Console.WriteLine("月: " + match.Groups[2].Value);
Console.WriteLine("日: " + match.Groups[3].Value);
}
- 零宽断言(Zero - width Assertions):这是一种特殊的匹配方式,它不消耗字符,只是在某个位置进行断言。例如,
(? =...)是正向肯定预查,它用于查找后面跟着特定模式的位置。假设要找到后面跟着abc的数字,可以这样写:
string assertText = "1abc 2def";
Regex assertRegex = new Regex(@"\d(? =abc)");
MatchCollection matches = assertRegex.Matches(assertText);
foreach (Match match in matches)
{
Console.WriteLine(match.Value);
}
- 替换匹配的文本(Regex.Replace):可以使用
Regex.Replace方法来替换匹配正则表达式的文本部分。例如,将一段文本中的所有数字替换为#。
string replaceText = "abc123def"; string replaced = Regex.Replace(replaceText, @"\d", "#"); Console.WriteLine(replaced);
总结
到此这篇关于C#正则表达式的详细使用说明的文章就介绍到这了,更多相关C#正则表达式使用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
