C#中正则表达式的使用

C# 正则表达式 下面列出了用于定义正则表达式的各种类别的字符、运算符和结构。字符转义字符类定位点分组构造限定符反向引用构造备用构造替换杂项构造。 阅读详情


目前为止,许多编程语言和工具都包含对正则表达式的支持,C#也不例外,C#基础类库中包含有一个命名空间(System.Text.RegularExpressions)和一系列可以充分发挥规则表达式威力的类(Regex、Match、Group等)。那么,什么是正则表达式,怎么定义正则表达式呢?

 

一、正则表达式基础

l          什么是正则表达式

   在编写字符串的处理程序时,经常会有查找符合某些复杂规则的字符串的需要。正则表达式就是用于描述这些规则的工具。换句话说,正则表达式就是记录文本规则的代码。

    通常,我们在使用WINDOWS查找文件时,会使用通配符(*和?)。如果你想查找某个目录下的所有Word文档时,你就可以使用*.doc进行查找,在这里,*就被解释为任意字符串。和通配符类似,正则表达式也是用来进行文本匹配的工具,只不过比起通配符,它能更精确地描述你的需求——当然,代价就是更复杂。

l          一个简单的例子——验证电话号码

学习正则表达式的最好方法是从例子开始,下面我们从验证电话号码开始,一步一步的了解正则表达式。

在我们国家,电话号码(如:0379-65624150)通常包含3到4为以0开头的区号和一个7或8为的号码,中间通常以连字符’-’隔开。在这个例子中,首先我们要介绍一个元字符\d,它用来匹配一个0到9的数字。这个正则表达式可以写成:^0\d{2,3}-\d{7,8}$

我们来对他进行分析,0匹配数字“0”,\d匹配一个数字,{2,3}表示重复2到3次,-只匹配”-”自身,接下来的\d同样匹配一个数字,而 {7,8}则表示重复7到8次。当然,电话号码还可以写成 (0379)65624150,这里就交给读者完成。

l          元字符

在上面的例子中,我们接触到了一个元字符\d,正如你所想的,正则表达式还有很多像\d一样的元字符,下表列出了一些常用的元字符:

 

元字符

说明

.

匹配除换行符以外的任意字符

\b

匹配单词的开始或结束

\d

匹配数字

\s

匹配任意的空白符

\w

匹配字母或数字或下划线或汉字

^

匹配字符串的开始

$

匹配字符串的结束

表1、常用的元字符

l          转义字符

   如果你想查找元字符本身的话,比如你查找.,或者*,就出现了问题:你没办法指定它们,因为它们会被解释成别的意思。这时你就得使用\来取消这些字符的特殊意义。因此,你应该使用\.和\*。当然,要查找\本身,你也得用\\.

例如:unibetter\.com匹配unibetter.com,C:\\Windows匹配C:\Windows。

l          限定符

限定符又叫重复描述字符,表示一个字符要出现的次数。比如我们在匹配电话号码时使用的{3,4}就表示出现3到4次。常用的限定符有:

 

限定符

说明

*

重复零次或更多次

+

重复一次或更多次

?

重复零次或一次

{n}

重复n次

{n,}

重复n次或更多次

{n,m}

重复n到m次

表2、常用的限定符

二、.NET中正则表达式的支持

    System.Text.RegularExpressions 命名空间包含一些类,这些类提供对 .NET Framework 正则表达式引擎的访问。该命名空间提供正则表达式功能,可以从运行在 Microsoft .NET Framework 内的任何平台或语言中使用该功能。

 

    1、在C#中使用正则表达式

在了解了C#中支持正则表达式的类后,我们一起来将上面提到的验证电话号码的正则表达式写入C#代码中,实现电话号码的验证。

第一步,建立一个名为SimpleCheckPhoneNumber的Windows项目。

第二步,引入System.Text.RegularExpressions命名空间。

第三步,写出正则表达式。这里的正则表达式就是上面的验证号码的字符串。由于上面的字符串只能验证用连字符连接区号和号码的方式的电话号码,所以我们做了一些修改:0\d{2,3}-\d{7,8}|\(0\d{2,3}\)\d{7,8}。在这个表达式中,| 号面的一部分是我们上面提到过的,后面一部分是用来验证(0379)65624150这种电话号码写法的。由于 (  和 ) 也是元字符,所以要用转义字符。| 表示分支匹配,要么匹配前面的一部分,要么匹配后面的一部分。

第四步,正则表达式构造一个Regex类。

第五步,使用Regex类的IsMatch方法验证匹配。Regex类的IsMatch()方法返回一个bool值,如果有匹配项,返回true,否则返回false。

 

三、正则表达式进阶

l      分组

在匹配电话号码的时候,我们已经用到过重复单个字符。下面我们来了解如何使用分组来匹配一个IP地址。

众所周知,IP地址是四段点分十进制的字符串表示的。所以,我们可以通过地址的分组,来进行匹配。首先,我们来匹配第一段:2[0-4]\d|25[0-5]|[01]?\d\d? 这段正则表达式可以匹配IP地址的一段数字。2[0-4]\d 匹配以2开头,十位为0到4,个位为任何数字的三位字段,25[0-5] 匹配以25 开头,个位为0到5 的三位字段,[01]?\d\d? 匹配任何以1者0头,个位和十位为任何数子的字段。? 表示出现零次或一次。所以, [01] 和 最后一个 \d 都可以不出现,如果我们再向这个字符串后面添加一个 \. 来匹配 . 就可以划分一个段了。现在,我们把 2[0-4]\d|25[0-5]|[01]?\d\d?\. 当做一个分组,就可以写成 (2[0-4]\d|25[0-5]|[01]?\d\d?\.) 。接下来我们就来使用这个分组。将这个分组重复两次,然后,再使用 2[0-4]\d|25[0-5]|[01]?\d\d? 就可以了。完整的正则表达式为: (2[0-4]\d|25[0-5]|[01]?\d\d?\.){3}2[0-4]\d|25[0-5]|[01]?\d\d?

 

l      后向引用

在我们了解分组以后,我们就可以使用后向引用了。所谓后向引用,就是使用前面捕获的结果,对后面的字符进行匹配。多用于匹配重复字符。比如匹配 go go 这样的重复字符。我们就可以使用 (go) \1来进行匹配。

默认情况下,每个分组会自动拥有一个组号,规则是:从左向右,以分组的左括号为标志,第一个出现的分组的组号为1,第二个为2,以此类推。当然,你也可以自己指定子表达式的组名。要指定一个子表达式的组名,请使用这样的语法:(?<Word>\w+)(或者把尖括号换成'也行:(?'Word'\w+)),这样就把\w+的组名指定为Word了。要反向引用这个分组捕获的内容,你可以使用\k<Word>,所以上一个例子也可以写成这样:\b(?<Word>\w+)\b\s+\k<Word>\b。

自定义组名还有另外一个好处,在我们的C#程序中,如果需要得到分组的值,我们就可以很明确的使用我们定义的分组的名字来得到,而不必使用下标。

当我们并不想使用后向引用时,是不需要捕获组记忆任何东西的,这种情况下就可以利用(?:nocapture)语法来主动地告诉正则表达式引擎,不要把圆括号的内容当作捕获组,以便提高效率。

l      零宽断言

在前面的元字符介绍中,我们已经知道了有这样一类字符,可以匹配一句话的开始、结束(^ $)或者匹配一个单词的开始、结束(\b)。这些元字符只匹配一个位置,指定这个位置满足一定的条件,而不是匹配某些字符,因此,它们被成为 零宽断言。所谓零宽,指的是它们不与任何字符相匹配,而匹配一个位置;所谓断言,指的是一个判断。正则表达式中只有当断言为真时才会继续进行匹配。

在有些时候,我们精确的匹配一个位置,而不仅仅是句子或者单词,这就需要我们自己写出断言来进行匹配。下面是断言的语法:

 

断言语法

说明

(?=pattern)

前向肯定断言,匹配pattern前面的位置

(?!pattern)

前向否定断言,匹配后面不是pattern的位置

(?<=pattern)

后向肯定断言,匹配pattern后面的位置

(?<!pattern)

后向否定断言,匹配前面不是pattern的位置

表3、断言的语法及说明

很难理解吗?我们来看一个例子。

有一个标签:<book>,我们想要得到标签<book>的标签名(book),这个时候,我们就可以使用断言来处理。看下面这个表达式:(?<=\<)(?<tag>\w*)(?=\>) ,使用这个表达式,可以匹配< 和 >之间的字符,也就是这里的book。使用断言还还可以写出更加复杂的表达式,这里就不再举例了。

还有一点非常重要,就是断言语法所使用的圆括号并不作为捕获组,所以不能使用编号或命名来对它进行引用。

 

l 贪婪与懒惰

当正则表达式中包含能接受重复的限定符时,通常的行为是(在使整个表达式能得到匹配的前提下)匹配尽可能多的字符。来看一下这个表达式:a\w*b ,用它来匹配字符串 aabab 时,得到的匹配结果是 aabab 。这种匹配被称为贪婪匹配。

有些时候,我们希望让它尽可能的少重复,即用上面的例子得到的匹配结果是 aab,这时我们就要使用懒惰匹配。懒惰匹配需要在重复限定符的后面添加一个 ? 符号,上面的表达式就可以写成:a\w*?b 我们再来匹配字符串 aabab时,得到的匹配结果是 aab 和 ab 。

也许这个时候你要问,ab 比aab重复次数更少,为什么不先匹配ab呢?其实在正则表达式中还有比贪婪/懒惰优先级更高的规则:最先开始的匹配拥有最高的优先权——The match that begins earliest wins。

l 注释

语法:(?#comment)

   例如:2[0-4]\d(?#200-249)|25[0-5](?#250-255)|[01]?\d\d?(?#0-199)

   注意:如果使用注释,则需要格外注意不要在注释的小括号前面出现空格、换行符等一些字符,如果可以忽略这些字符,则最好使用“忽略模式里的空白符”选项,即C#中RegexOptions枚举的IgnorePatternWhitespace选项(C#中的RegexOptions枚举下面将会提到)。

 

l C#中的处理选项

在C#中,可以使用RegexOptions 枚举来选择C#对正则表达式的处理方式。下面是MSDN中RegexOptions 枚举的成员介绍:

 

 

 

l C#中Capture类、Group类、Match类

Capture类:表示单个子表达式捕获中的结果。Capture类表示单个成功捕获中的一个子字符串。该类没有公共构造函数,可以从Group类或者Match类中得到一个Capture类的对象集合。Capture类有三个常用属性,分别是Index、Length和Value。Index表示捕获的子字符串的第一个字符的位置。Length表示捕获的子字符串的长度,Value表示捕获的子字符串。

Group类:表示正则表达式中分组的信息。该类提供了对分组匹配的正则表达式的支持。该类没有公共构造函数。可以从Match类中得到一个Group类的集合。如果正则表达式中的分组已命名,则可以使用名字对其进行访问,如果没有命名,则可以采用下标访问。注意:每一个Match的Groups集合中的第0个元素(Groups[0])都是这个Match捕获的字符串,也是Capture的Value。

Match类:表示单个正则表达式匹配的结果。该类同样没有公共构造函数,可以从Regex类的Match()方法得到该类的一个实例,也可以使用Regex类的Matches()方法得到给类的一个集合。

这三个类都能表示单个正则表达式匹配的结果,但Match类得到的更为详细,包含捕获和分组信息。所以,Match类在这个三个类中是最常用的。

如果认为此文对您有帮助,别忘了支持一下哦!

零宽断言

 

我们前面的一些简单匹配,都是先知道要匹配的子字符的一些信息,然后用些元字符和限制字符来表示它.进而匹配出结果.这是直接的匹配方式.还可以通过一些间接的匹配信息,比如知道子字符串前面有啥字符,屁股后面跟着些啥字符来匹配.

于是出现了零宽断言这个怪怪的名词,其实它代表的意思是这样,零宽表示那个表达式不占用地方,宽度为0,比如前面说的^$匹字符串的开头或结尾.它不占用地方,只表示开头或结尾这样一个位置概念.至于断言嘛是逻辑理论里面的一个说法.简单的说就是做判断了,下结论了.

零宽度正预测先行断言(?=exp)  它表示某个字符串背后跟着字符串exp比如.*(?=fool)表示某个字符以fool结尾.如果有字符you are afool.则匹配到的子字符是you are a

零宽度正回顾后发断言(?<=exp) 它表示某个字符串前面有字符串exp比如(?<=fuck)表示某个字符串前面有fuck.如果有字符fuck you则匹配的结果是 you

有了有通过前面或后面有某个字符串来判断,自然就可以有通过前面或后面没有啥字符来判断.这也是相反的意思.表示方法也差不多,只是=号变!

零宽度负预测先行断言 (?!exp) 它表示某个字符串后面没有跟着exp比如hao(?!\d)表示字符hao后面没紧跟着数字,如果有字符hao123,则不能匹配.如果是字符hao 123则匹配到hao

零宽度负回顾后发断言 (?<!exp)它表示某个字符串前面没有exp比如(?<!\d)hao表示字符串hao前没有数字.如果有字符123hao则匹配失败.如果是字符123 hao则匹配到hao


SS524V100 CVBS调试实战:从VO配置到画面稳定的完整链路 CVBS作为一种经典的模拟视频接口,在数字视频主导的今天仍广泛用于老式监视器、工业相机和监控后端的预览场景。与HDMI等数字接口不同,CVBS没有热插拔检测和分辨率协商机制,其同步时序、制式(PAL/NTSC)以及输出电平完全依赖发送端精确配置,因此调试难度较高。海思SS524V100的VO模块提供了灵活的配置接口,但也对开发者提出了更高要求。从MPP初始化、VO通道绑定到模拟DAC输出,任何环节出错都可能导致黑屏、滚动条或黑白画面。本文从硬件连接、工具准备出发,系统梳理了SS524V100 CVBS输出的 阅读详情

相关推荐

DNA pull-down技术避坑指南:从探针设计到质谱验证的完整实验方案

本文提供了一份详尽的DNA pull-down技术实战避坑指南,涵盖从探针设计、生物素标记、磁珠选择与预处理,到结合洗脱优化及下游质谱验证或Western Blot验证的全流程。重点解析了如何通过精细操作降低非特异性结合、提高实验特异性与重复性,并对比了质谱与WB两种验证路径的适用场景,旨在帮助研究者构建稳健可靠的DNA-蛋白质互作研究体系。

weixin_29274337的博客 495

C# 使用正则表达式

正则表达式是一种用于匹配和处理文本的强大工具,常用于字符串的搜索、替换、验证等操作。在C#中,可以使用命名空间提供的类来处理正则表达式。正则表达式由一系列字符和特殊字符组成,用于定义模式或规则,用于匹配和操作字符串。它具有灵活、强大的模式匹配能力,可以根据特定的模式对文本进行高效的搜索和操作。?[]()\d\w\s在C#中,可以使用Regex类来创建正则表达式对象,并使用其方法进行匹配、搜索、替换等操作。MatchMatchesReplaceSplit上述代码使用正则表达式\b\w+

微软技术分享 2万+

Postman调试海康ISAPI接口全记录:从鉴权失败到成功修改设备名的踩坑指南

本文详细记录了使用Postman调试海康ISAPI接口的全过程,从鉴权失败到成功修改设备名的实战经验。涵盖Digest认证机制、XML请求体构造、常见错误排查及代码实现过渡,帮助开发者高效解决海康设备集成中的各种问题。

weixin_42620913的博客 662

正则表达式匹配P标签中包含Img标签或单独匹配img标签

以上就是使用正则表达式匹配img标签或使用正则表达式匹配P标签中包含img的P标签使用方式。

suxuelian的博客 2423

自动化革命:AI在需求分析、代码生成与测试中的深度应用

在2025年的科技浪潮中,人工智能(AI)已不再是实验室中的概念,而是深度渗透至软件开发的全生命周期。从需求分析的精准捕捉,到代码生成的自动化创作,再到测试环节的智能覆盖,AI正以革命性姿态重塑软件工程的核心环节。本文将结合2025年最新数据与行业实践,解析AI如何在这三大领域实现深度应用。

1512

从零搭建PIC MCU开发环境:MPLAB IDE与HI-TECH编译器安装破解全攻略

本文详细介绍了从零搭建PIC MCU开发环境的完整流程,包括MPLAB IDE 8.85的安装配置、HI-TECH C编译器的安装与破解,以及PICkit3编程器的使用技巧。通过清晰的步骤说明和常见问题解决方案,帮助开发者快速搭建稳定的PIC单片机开发环境,适用于PIC16/18系列MCU开发。

weixin_29188997的博客 292

C#正则表达式指南

1 运算符 “表达式”属性支持以下正则表达式运算符: 表达式 说明 . 指示任何字符。 \ 指示后面的字符应按原义而不是作为特殊字符进行解释。例如,\. 指示“.”。 () 将括号内的运算符分组。 {n} 生成前面项的

YaoXTao的专栏 2151

手把手教你学Simulink--双足机器人的反步控制方法仿真

本文介绍了在Simulink中基于反步控制方法进行双足机器人仿真研究的步骤。主要内容包括:1)准备工作,包括MATLAB/Simulink安装和相关工具箱配置;2)构建简化双足机器人模型;3)设计反步控制器,阐述其递归设计原理及Lyapunov函数构造方法;4)通过MATLAB Function块实现控制逻辑并连接模型;5)仿真参数配置和结果分析。文章强调反步控制适用于非线性系统,通过逐步构造虚拟控制律保证系统稳定性,并指出需要多次调试和查阅文献来优化控制效果。该教程为研究双足机器人运动控制提供了实用的仿真

MHD0815的博客 153

C#正则表达式(二)

正则表达式是一种匹配文本的模式。.NET框架提供了允许这种匹配的正则表达式引擎,模式由一个或多个字符、运算符和结构组成。C#中正则表达式有以下几种: 一、 字符转义正则表达式中的反斜杠“\”指示以下值之一:后接字符为特殊字符,例如,\b 是指示正则表达式匹配应从单词边界开始的定位点,\t表示制表符,而 \x020 表示空间。 未转义语言构造的字符应按字面意思进行解释,例如,大括号 ({) 开始定义

ywh的博客 753

Open Lovable 网站克隆AI工具超详细实战教程(含环境配置、排错与代码修改)

本教程面向有一定计算机基础的新手用户,提供一份全面、深入的 Open Lovable 使用指南。从开发环境搭建、API密钥获取、项目部署到网站克隆、代码下载、本地运行与二次开发,涵盖全流程细节与常见问题解决方案。通过本教程,新手可掌握如何利用AI驱动的Open Lovable工具,将任意目标网站智能复刻为结构清晰、可编辑的现代前端项目(React/Vite),实现快速原型开发与技术学习。

hy行者勇哥的博客 4963

ERROR: Could not install packages due to an OSError: [Errno 2] No such file or directory解决方案

本文主要介绍了ERROR: Could not install packages due to an OSError: [Errno 2] No such file or directory解决方案,希望能对使用Python的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案

weixin_43178406的博客 11万+

[转]C#中正则表达式的应用

最近有许多朋友问我正则表达式的问题,简单的说,正则表达式是一种搜索算法,也许你对使用*,?等通配符的使用一点不陌生,但有时候光靠通配符是远远不能满足我们搜索字符串的需求,因此就有人把正则表达式引入进来,下面将介绍在C#中如何应用正则表达式。C#中的正则表达式包含在.NET基础类库的一个名称空间下,这个名称空间就是System.Text.RegularExpressions。该名称空间包括...

dianlingju5915的博客 257

SCSA,scCATCH,SciBet,SingleR 四种注释方法比较

以下是和四种细胞类型注释方法的详细对比,从。

qq_40256654的博客 1215

C#中正则表达式(Regular Expression)

在C#中,正则表达式(Regular Expression)是一种强大的模式匹配工具,用于在文本中搜索、匹配和操作符合特定模式的字符串。正则表达式非常强大且灵活,可以用于各种复杂的模式匹配和字符串操作场景,包括验证输入、提取数据、格式化文本等。详细了解正则表达式的语法和功能,可以更好地利用它在C#中进行字符串处理。正则表达式语法非常丰富和灵活,还有其他更多的字符和功能,例如分组、捕获、零宽断言等。详细了解正则表达式语法和功能,可以在实际使用中更有效地构建和应用正则表达式模式。方法查找所有数字,并使用。

ultramand的博客,重生之我在cad上二次开发猛猛敲C#代码~ 2021

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

C#中正则表达式

在C#中,正则表达式由命名空间提供,可以使用Regex类来处理正则表达式。以下是一些常见的用法及示例。

qq_25699299的博客 592

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

C# 中正则表达式 Group 分组

引用:http://www.cnblogs.com/kiant71/archive/2010/08/14/1799799.html 在一个正则表达式中,如果要提取出多个不同的部分(子表达式项),需要用到分组功能。 在 C# 正则表达式中,Regex 成员关系如下,其中 Group 是其分组处理类。 Regex –> MatcheCollection (匹配项集合) ...

198

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

对C#中正则表达式的一些解读和总结

<!--google_ad_client = "pub-2947489232296736";/* 728x15, 创建于 08-4-23MSDN */google_ad_slot = "3624277373";google_ad_width = 728;google_ad_height = 15;//--><script type="text/javascript"

zgqtxwd的专栏 346
上一篇: C#操作word的一些函数
下一篇: [原]C# 读取Word 表格数据(单元格纵合并)
爬虫仔蛙
博客等级 码龄15年 62粉丝 185原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值