首页 理论教育 C#正则表达式学习指南

C#正则表达式学习指南

时间:2023-10-22 理论教育 版权反馈
【摘要】:图11-11 正则表达式类对象的关系在下面的内容中,将分别简要介绍上述正则表达式类的具体应用方法。在Regex内使用了各种静态方法,允许不显式的创建其他类的新实例,以使用其他正则表达式类。图11-15 实例执行结果7.CaptureCapture类包含来自单个子表达式的捕获结果。

C#正则表达式学习指南

在System.Text.RegularExpressions命名空间内,定义了七个常用的正则表达式类。分别是Regex、Match、MatchCollection、GroupCollection、CaptureCollection、Group和Capture。上述各个类对象之间的关系如图11-11所示。

978-7-111-36370-5-Part02-436.jpg

图11-11 正则表达式类对象的关系

在下面的内容中,将分别简要介绍上述正则表达式类的具体应用方法。

1.Regex

Regex表示只读的正则表达式,这样的正则表达式是不可变的。在Regex内使用了各种静态方法,允许不显式的创建其他类的新实例,以使用其他正则表达式类。

Regex类中有如下四种方式的构造函数。

978-7-111-36370-5-Part02-437.jpgRegex():用于初始化Regex类的新实例。

978-7-111-36370-5-Part02-438.jpgRegex(String):用于为指定的正则表达式初始化并编译Regex类的一个新实例。

978-7-111-36370-5-Part02-439.jpgRegex(SerializationInfo,StreamingContext):用序列化数据初始化Regex类的新实例。

978-7-111-36370-5-Part02-440.jpgRegex(String,RegexOptions):用修改模式选项为指定的正则表达式初始化并编译Regex类的一个新实例。

在Regex(String,RegexOptions)方式中,可以在构造函数内传入一个RegexOptions枚举值,用于设置正则表达式的选项。RegexOptions定义值的具体说明如下。

978-7-111-36370-5-Part02-441.jpgCompiled:设置将正则表达式编译为程序集。

978-7-111-36370-5-Part02-442.jpgCultureInvariant:设置忽略语言中的区域性差异。

978-7-111-36370-5-Part02-443.jpgECMAScript:设置表达式启用符合ECMAScript的行为。

978-7-111-36370-5-Part02-444.jpgExplicitCapture:设置有效捕获仅形式为(?<name>…)的显式命名或编号的组。

978-7-111-36370-5-Part02-445.jpgIgnoreCase:设置不区分大、小写的匹配。

978-7-111-36370-5-Part02-446.jpgIgnorePatternWhitespce:消除模式中的非转义空白,并启用使用#标记的注释。

978-7-111-36370-5-Part02-447.jpgMultiline:多行模式,用于更改∧和$的含义。

978-7-111-36370-5-Part02-448.jpgNone:指定不设置选项。

978-7-111-36370-5-Part02-449.jpgRightToLeft:设置搜索从右向左进行。

978-7-111-36370-5-Part02-450.jpgSingleLine:设置为单行模式。

2.Match

Match类表示正则表达式匹配操作的结果。使用Regex类的Match()方法,可以返回Match类型对象,以便找到输入字符串中的第一个匹配项。例如下面的代码:

978-7-111-36370-5-Part02-451.jpg

在上述代码中,使用了Match类的Match.Success属性来验证是否找到匹配。

3.MatchCollection

MatchCollection类用于表示成功的、非重叠的匹配序列。此类是只读的,没有公共构造函数。MatchCollection实例由Regex.Matches()方法返回。看下面一段代码:

978-7-111-36370-5-Part02-452.jpg

在上述代码中,通过使用Regex类的Matches()方法在指定字符串中找到指定字符的匹配位置。具体实现流程如下。

1)定义Regex类对象mm,用于设置检索字符是“abc”。

2)设置检索对象nn的值是“321abc456cdef33abc333abcdef”。

3)使用Matches()方法开始检索。(www.xing528.com)

4)将检索结果保存在数组shuzu和zu内。

5)通过WriteLine()方法逐一输出检索结果。

执行后将输出字符串“321abc456cdef33abc333abcdef”内的字符“abc”的位置,如图11-12所示。

978-7-111-36370-5-Part02-453.jpg

图11-12 实例执行结果

4.GroupCollection

GroupCollection类能够在捕获某组集合的同时,返回单个匹配中捕获的组的集合。此集合是只读的,没有公共构造函数。GroupCollection类的实例在Match.Groups()方法中返回。

例如,通过下面的代码查找并输出由正则表达式捕获的数组数目:

978-7-111-36370-5-Part02-454.jpg

在上述代码中,定义了Regex类实例对象mm,设置了“abc”、“ab”和“b”的组。然后使用Match属性,返回了nn内检索到上述组的数量。具体执行结果如图11-13所示。

5.CaptureCollection

978-7-111-36370-5-Part02-455.jpg

图11-13 实例执行结果

CaptureCollection类可以设置捕获的子字符串序列,并返回由单个捕获组执行的集合。一个捕获组可以在单个匹配中捕获多个字符串。其中Math和group共同提供Captures属性,以便于对捕获的子字符串集合的访问。看下面的一段代码:

978-7-111-36370-5-Part02-456.jpg

978-7-111-36370-5-Part02-457.jpg

在上述代码中,使用了正则表达式“(AB)+”来检索字符串“ABCDABCDabcdABcd”中的一个或多个匹配,然后使用了Captures属性返回了多组捕获的子字符串。具体执行结果如图11-14所示。

978-7-111-36370-5-Part02-458.jpg

图11-14 实例执行结果

6.Group

Group类用于表示来自单个捕获组的结果。因为Group可以在单个匹配中捕获0个、1个或多个字符串,所以里面也包含Captures对象的集合。并且因为Group继承于Capture,所以可以直接访问最后捕获的子字符串。

Group实例有如下两种返回情况。

1)Match.Groups(groupnum)属性返回。

2)Match.Groups(“groupname”)属性返回,此时使用“(?<groupname>)”分隔符

看下面的一段代码:

978-7-111-36370-5-Part02-459.jpg

在上述代码中,分别定义了检索对象rr的值是检索字符串“abc”、“ab”和“b”的组;然后通过嵌套分组构造将子字符串捕获到组中。具体执行结果如图11-15所示。

978-7-111-36370-5-Part02-460.jpg

图11-15 实例执行结果

7.Capture

Capture类包含来自单个子表达式的捕获结果。例如在下面代码中,从Group中的每个成员中提取Capture集合,并且将变量pp和ll分配给找到的每一个字符串的初始字符串中的位置。

978-7-111-36370-5-Part02-461.jpg

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈