C#System.Text.RegularExpressions.Regex使用 正则表达式

需要引入命名空间 using System.Text.RegularExpressions;(若不引入,则写Regex时要写成 System.Text.RegularExpressions.Regex)
使用方法举例:

string context="编号:136598";
string st;
st = System.Text.RegularExpressions.Regex.Replace(context, @"[^0-9]+", "");//表示匹配非数字字符,用空字符串代替

结果为st=136598。
(1)@符号
在C#中""为转义字符,@符号用于忽略转义字符,如涉及到路径

string path_1 = "D:\\文件名称\\name.txt";
string path_2 = @"D:\文件名称\name.txt";

以上两种写法等效。
(2)基本语法字符

符号 含义
\d 0-9的数字
\D \d的补集,所有非数字的字符(同[^0-9])
\w 单词字符,指大小写字母、0-9数字、下划线
\W \w的补集
\s 空白字符,包括换行符\n、回车符\r、制表符\t、垂直制表符\v、换页符\f
\S \s的补集
. 除换行符\n以外的任意字符
[…] 匹配[]内所列出的所有字符
[^…] 匹配非[]内所列出的所有字符

举例:

string context = "这段文字共2329个字";
int count = 0;
count = int.Parse(System.Text.RegularExpressions.Regex.Replace(context1, @"\D", ""));//其中@"\D"可用@"[^0-9]"代替
string i = "saft";
string m = "2134";
System.Text.RegularExpressions.Regex t = new System.Text.RegularExpressions.Regex(@"\D");//指定表达式
bool b=t.IsMatch(i);//与表达式是否匹配  true
b=t.IsMatch(m);//false

(3)定位字符
定位字符所代表的是一个虚的字符,代表一个位置

符号 含义
^ 表示其后的字符必须位于字符串的开始处
$ 表示其前面的字符必须位于字符串的结束处
\b 匹配一个单词的边界
\B 匹配一个非单词的边界
\A 前面的字符必须位于字符处的开始处
\z 前面的字符必须位于字符串的结束处
\Z 前面的字符必须位于字符串的结束处,或位于换行符前

举例:

string n = "Live for nothing,die for something";
string m = "Live for nothing,die for some thing";
Regex r1 = new Regex(@"\bthing\b");
Console.WriteLine("r1 match count:" + r1.Matches(n).Count);//0  r1中的字符在n中出现的次数
Regex r2 = new Regex(@"thing\b");
Console.WriteLine("r2 match count:" + r2.Matches(n).Count);//2
Regex r3 = new Regex(@"\bthing\b");Console.WriteLine("r3 match count:" + r3.Matches(m).Count);//1

(4)重复描述字符

符号 含义
{n} 匹配前面的字符n次
{n,} 匹配前面的字符n次或多于n次
{n,m} 匹配前面的字符n到m次
? 匹配前面的字符0或1次
+ 匹配前面的字符1次或多于1次
* 匹配前面的字符0次或多于0次

举例:

string x = "100";
Regex r = new Regex(@"^\d{1}[1-9]?\d{2}$");//同 @"^\+?[1-9]?\d{2}$"
int i = r.Matches(x).Count;//1

(5)择一匹配
[0-9]也是属于一种择一匹配,但是只能匹配单个字符,符号(|)提供了更大的范围,例如(ab|xy)表示匹配ab或xy,注意"|“与”()"是一个整体。
举例:

//匹配[0,100.0]之间的数字,含小数点的数字小数点后字符不能缺省
string a = "100";
string b = "99.28";
string c = "100.02";
string d = "100.0";
Regex r = new Regex(@"^\+?((100(.0+)*)|[1-9]?[1-9](\.\d+)*)$");
int i = r.Matches(a).Count;//1
int j = r.Matches(b).Count;//1
int k = r.Matches(c).Count;//0
int l = r.Matches(d).Count;//1

(6)特殊字符匹配
举例:

//  匹配\
string x = "\\";
Regex r1 = new Regex(@"^\\$");
int i = r1.Matches(x).Count;//1
Regex r2 = new Regex("^\\\\$");
int j = r2.Matches(x).Count;//1//  匹配"
string y = "\"";
Regex r0 = new Regex("^\"$");
int k = r0.Matches(y).Count;//1
Regex r = new Regex(@"^""$");
int l = r.Matches(y).Count;//1

(7)组与非捕获组
举例:

//正则表达式引擎会记忆“()”中匹配到的内容,作为一个“组”,并且可以通过索引的方式进行引用。表达式中的“\1”,用于反向引用表达式中出现的第一个组,即粗体标识的第一个括号内容,“\2”则依此类推。
string x = "Live for nothing,die for something";
string y = "Live for nothing,die for somebody";
Regex r = new Regex(@"^Live ([a-z]{3}) no([a-z]{5}),die \1 some\2$");
Console.WriteLine("x match count:" + r.Matches(x).Count);//1
Console.WriteLine("y match count:" + r.Matches(y).Count);//0//获取组中的内容。注意,此处是Groups[1],因为Groups[0]是整个匹配的字符串,即整个变量x的内容。
string x = "Live for nothing,die for something";
Regex r = new Regex(@"^Live for no([a-z]{5}),die for some\1$");
if (r.IsMatch(x))
{Console.WriteLine("group1 value:" + r.Match(x).Groups[1].Value);//输出:thing}//可根据组名进行索引。使用以下格式为标识一个组的名称(?<groupname>…)。
string x = "Live for nothing,die for something";
Regex r = new Regex(@"^Live for no(?<g1>[a-z]{5}),die for some\1$");
if (r.IsMatch(x))
{Console.WriteLine("group1 value:" + r.Match(x).Groups["g1"].Value); }//输出:thing//删除原字符串中重复出现的“nothing”。在表达式之外,使用“$1”来引用第一个组,下面则是通过组名来引用:
string x = "Live for nothing nothing";
Regex r = new Regex(@"([a-z]+) \1");
if (r.IsMatch(x))
{x = r.Replace(x, "$1");Console.WriteLine("var x:" + x);//输出:Live for nothing}string x = "Live for nothing nothing";
Regex r = new Regex(@"(?<g1>[a-z]+) \1");
if (r.IsMatch(x))
{x = r.Replace(x, "${g1}");Console.WriteLine("var x:" + x);//输出:Live for nothing}//在组前加上“?:”表示这是个“非捕获组”,即引擎将不保存该组的内容。
string x = "Live for nothing";
Regex r = new Regex(@"^Live for no(?:[a-z]{5})$");
if (r.IsMatch(x))
{Console.WriteLine("group1 value:" + r.Match(x).Groups[1].Value);//输出:(空)}

(8)贪婪与非贪婪
正则表达式的引擎是贪婪,只要模式允许将匹配尽可能多的字符,通过在“重复描述字符”(*,+)后面添加“?”,可以将匹配模式改为非贪婪。
举例:

string x = "Live for nothing,die for something";
Regex r1 = new Regex(@".*thing");
if (r1.IsMatch(x))
{Console.WriteLine("match:" + r1.Match(x).Value);//输出:Live for nothing,die for something}Regex r2 = new Regex(@".*?thing");if (r2.IsMatch(x)){Console.WriteLine("match:" + r2.Match(x).Value); //输出:Live for nothing}}
}

(9)回溯与非回溯
使用“(?>…)”方式进行非回溯声明,由于正则表达式引擎的贪婪特性,导致它在某些情况下进行回溯已获得匹配。
举例:

string x = "Live for nothing,die for something";
Regex r1 = new Regex(@".*thing,");
if (r1.IsMatch(x))
{Console.WriteLine("match:" + r1.Match(x).Value); //输出:Live for nothing, }Regex r2 = new Regex(@"(?>.*)thing,");if (r2.IsMatch(x))//不匹配{Console.WriteLine("match:" + r2.Match(x).Value);}
//在r1中,“.*”由于其贪婪特性,将一直匹配到字符串的最后,随后匹配“thing”,但在匹配“,”时失败,此时引擎将回溯,并在“thing,”处匹配成功。在r2中,由于强制非回溯,所以整个表达式匹配失败。
}

(10)正向预搜索、反向预搜索
正向预搜索声明格式:正声明 “(?=…)”,负声明 “(?!..)” ,声明本身不作为最终匹配结果的一部分。
举例

string x = "1024 used 2048 free";
Regex r1 = new Regex(@"\d{4}(?= used)");
if (r1.Matches(x).Count == 1)
{Console.WriteLine("r1 match:" + r1.Match(x).Value);//输出:1024}Regex r2 = new Regex(@"\d{4}(?! used)");if (r2.Matches(x).Count == 1){Console.WriteLine("r2 match:" + r2.Match(x).Value); //输出:2048}}
//r1中的正声明表示必须保证在四位数字的后面必须紧跟着“ used”,r2中的负声明表示四位数字之后不能跟有“ used”。
}

反向预搜索声明格式:正声明“(?<=)”,负声明“(?<!)”,声明本身不作为最终匹配结果的一部分。
举例:

string x = "used:1024 free:2048";
Regex r1 = new Regex(@"(?<=used:)\d{4}");
if (r1.Matches(x).Count == 1)
{Console.WriteLine("r1 match:" + r1.Match(x).Value);//输出:1024}Regex r2 = new Regex(@"(?<!used:)\d{4}");if (r2.Matches(x).Count == 1){Console.WriteLine("r2 match:" + r2.Match(x).Value);//输出:2048}}
//r1中的反向正声明表示在4位数字之前必须紧跟着“used:”,r2中的反向负声明表示在4位数字之前必须紧跟着除“used:”之外的字符串。
}

(11)十六进制字符范围
正则表达式中,可以使用 “\xXX” 和 “\uXXXX” 表示一个字符(“X” 表示一个十六进制数)形式字符范围:
\xXX 编号在 0到255 范围的字符,比如:空格可以使用 “\x20” 表示。
\uXXXX 任何字符可以使用 “\u” 再加上其编号的4位十六进制数表示,比如:汉字可以使用“[\u4e00-\u9fa5]”表示。
(12)值域完备匹配特殊考虑
对[0,100]的比较完备的匹配需要特殊考虑的地方包括
*00合法,00.合法,00.00合法,001.100合法
*空字符串不合法,仅小数点不合法,大于100不合法
*数值是可带后缀的,如“1.07f”表示该值为一个float类型(未考虑)

Regex r = new Regex(@"^\+?0*(?:100(\.0*)?|(\d{0,2}(?=\.\d)|\d{1,2}(?=($|\.$)))(\.\d*)?)$");

(13)精确匹配困难
有些需求要做到精确匹配比较困难,例如:日期、Url、Email地址等,其中一些你甚至需要研究一些专门的文档写出精确完备的表达式,对于这种情况,只能退而求其次,保证比较精确的匹配。例如对于日期,可以基于应用系统的实际情况考虑一段较短的时间,或者对于像Email的匹配,可以只考虑最常见的形式。

C#System.Text.RegularExpressions.Regex使用相关推荐

  1. Teams Bot 如何使用新的 System.Text.Json 库

    我最近把 LuckyDraw的代码升级到了 .net core 3.1,当然我也很想使用最新的微软json库,System.Text.Json这个库的性能比之前Newtonsoft.Json速度更快, ...

  2. 使用.Net6中的System.Text.Json遇到几个常见问题及解决方案

    前言 以前.NetCore是不内置JSON库的,所以大家都用Newtonsoft的JSON库,而且也确实挺好用的,不过既然官方出了标准库,那更方便更值得我们多用用,至少不用每次都nuget安装Newt ...

  3. 接口返回json对象出现套娃递归问题 | System.Text.Json 版本

    前言 看到一篇文章<Asp-Net-Core开发笔记:接口返回json对象出现套娃递归问题> 原文是使用 NewtonsoftJson 解决的返回json对象出现套娃递归问题: servi ...

  4. .NET 6 中的七个 System.Text.Json 特性

    忽略循环引用 在 .NET 5 中,如果存在循环依赖, 那么序列化的时候会抛出异常, 而在 .NET 6 中, 你可以选择忽略它. Category dotnet = new() {Name = &q ...

  5. .NET 6新特性试用 | System.Text.Json序列化代码自动生成

    前言 几乎所有.NET序列化程序的实现基础都是反射.下列代码是Newtonsoft.Json的实现: protected virtual JsonProperty CreateProperty(Mem ...

  6. System.Text.Json 中的字符编码

    System.Text.Json 中的字符编码 Intro 默认的 System.Text.Json 序列化的时候会把所有的非 ASCII 的字符进行转义,这就会导致很多时候我们的一些非 ASCII ...

  7. System.Text.Json 中的 JsonExtensionData

    System.Text.Json 中的 JsonExtensionData Intro 最近两天在排查我们 API 的一个问题,查看源码过程中发现 System.Text.Json 里有一个有意思的 ...

  8. System.Text.Json 自定义 Conveter

    System.Text.Json 自定义 Conveter Intro System.Text.Json 作为现在 .NET 默认提供的高性能 JSON 序列化器,对于一些比较特殊类型支持的并不太好, ...

  9. .NET 6 新特性 System.Text.Json 中的 Writeable DOM

    .NET 6 新特性 System.Text.Json 中的 Writeable DOM 特性 Intro 在 .NET 6 Preview 4 中,微软加入了 JSON Node 的支持,我们可以动 ...

  10. System.Text.Json中时间格式化

    转自:Rayom cnblogs.com/Rayom/p/13967415.html 简介 .Net Core 3.0开始全新推出了一个名为System.Text.Json的Json解析库,用于序列化 ...

最新文章

  1. 碰上摩尔纹怎么办?这5招帮你解决!
  2. 了解电商优惠券的一生,看完这篇就足够了!
  3. UITableView移除某一行cell的分割线
  4. python接口开发django_用 Django 开发接口
  5. 计算机应用基础0006 19秋在线作业2,川大《计算机应用基础0006》13春在线作业2
  6. 【Java】如何较好地将int转化成String
  7. UE4分支的Git Flow
  8. 5.PHP ES 使用
  9. 内存取证-volatility工具的使用
  10. TIFF图像文件格式详解
  11. Telink blt_soft_timer 改进
  12. 亿级用户下的新浪微博平台架构
  13. C语言链表创建的电子通讯录V1.0
  14. 创建OpenGL Context(WGL)
  15. 向前的快捷键_快速提高逼格的电脑快捷键你懂多少?
  16. Rabbit安装及简单的使用
  17. 每日一题 第二次考试 数据库题目,7.17数据库面试题目补充
  18. 王者荣耀最低战力查询-王者战区修改
  19. 花指令的原理、常用花指令收集及花指令示例
  20. Drupal 模块开发基本教程(三)

热门文章

  1. 2010年广州市公务员考试行测真题及答案解析
  2. xlsx模块 前端_React读取Excel——js-xlsx 插件的使用
  3. E45: 'readonly' option is set (add ! to override)
  4. java 图片与base64相互转化
  5. 有甲乙丙丁四个字,取出任意三个字,打印所有可能性
  6. ECSHOP问题总结
  7. 填空什么的月牙_“一( )月牙”填什么量词
  8. embed预览pdf_09.html使用iframe、embed查看pdf不显示(未解决),使用pdf.js预览pdf
  9. ioctl()函数的简单使用——获取本机的IP、掩码、HWaddr
  10. 计算机视觉的网站收集