在System.Text.RegularExpressions命名空间内,定义了七个常用的正则表达式类。分别是Regex、Match、MatchCollection、GroupCollection、CaptureCollection、Group和Capture。上述各个类对象之间的关系如图11-11所示。
图11-11 正则表达式类对象的关系
在下面的内容中,将分别简要介绍上述正则表达式类的具体应用方法。
1.Regex
Regex表示只读的正则表达式,这样的正则表达式是不可变的。在Regex内使用了各种静态方法,允许不显式的创建其他类的新实例,以使用其他正则表达式类。
Regex类中有如下四种方式的构造函数。
Regex():用于初始化Regex类的新实例。
Regex(String):用于为指定的正则表达式初始化并编译Regex类的一个新实例。
Regex(SerializationInfo,StreamingContext):用序列化数据初始化Regex类的新实例。
Regex(String,RegexOptions):用修改模式选项为指定的正则表达式初始化并编译Regex类的一个新实例。
在Regex(String,RegexOptions)方式中,可以在构造函数内传入一个RegexOptions枚举值,用于设置正则表达式的选项。RegexOptions定义值的具体说明如下。
Compiled:设置将正则表达式编译为程序集。
CultureInvariant:设置忽略语言中的区域性差异。
ECMAScript:设置表达式启用符合ECMAScript的行为。
ExplicitCapture:设置有效捕获仅形式为(?<name>…)的显式命名或编号的组。
IgnoreCase:设置不区分大、小写的匹配。
IgnorePatternWhitespce:消除模式中的非转义空白,并启用使用#标记的注释。
Multiline:多行模式,用于更改∧和$的含义。
None:指定不设置选项。
RightToLeft:设置搜索从右向左进行。
SingleLine:设置为单行模式。
2.Match
Match类表示正则表达式匹配操作的结果。使用Regex类的Match()方法,可以返回Match类型对象,以便找到输入字符串中的第一个匹配项。例如下面的代码:
在上述代码中,使用了Match类的Match.Success属性来验证是否找到匹配。
3.MatchCollection
MatchCollection类用于表示成功的、非重叠的匹配序列。此类是只读的,没有公共构造函数。MatchCollection实例由Regex.Matches()方法返回。看下面一段代码:
在上述代码中,通过使用Regex类的Matches()方法在指定字符串中找到指定字符的匹配位置。具体实现流程如下。
1)定义Regex类对象mm,用于设置检索字符是“abc”。
2)设置检索对象nn的值是“321abc456cdef33abc333abcdef”。
3)使用Matches()方法开始检索。(www.xing528.com)
4)将检索结果保存在数组shuzu和zu内。
5)通过WriteLine()方法逐一输出检索结果。
执行后将输出字符串“321abc456cdef33abc333abcdef”内的字符“abc”的位置,如图11-12所示。
图11-12 实例执行结果
4.GroupCollection
GroupCollection类能够在捕获某组集合的同时,返回单个匹配中捕获的组的集合。此集合是只读的,没有公共构造函数。GroupCollection类的实例在Match.Groups()方法中返回。
例如,通过下面的代码查找并输出由正则表达式捕获的数组数目:
在上述代码中,定义了Regex类实例对象mm,设置了“abc”、“ab”和“b”的组。然后使用Match属性,返回了nn内检索到上述组的数量。具体执行结果如图11-13所示。
5.CaptureCollection
图11-13 实例执行结果
CaptureCollection类可以设置捕获的子字符串序列,并返回由单个捕获组执行的集合。一个捕获组可以在单个匹配中捕获多个字符串。其中Math和group共同提供Captures属性,以便于对捕获的子字符串集合的访问。看下面的一段代码:
在上述代码中,使用了正则表达式“(AB)+”来检索字符串“ABCDABCDabcdABcd”中的一个或多个匹配,然后使用了Captures属性返回了多组捕获的子字符串。具体执行结果如图11-14所示。
图11-14 实例执行结果
6.Group
Group类用于表示来自单个捕获组的结果。因为Group可以在单个匹配中捕获0个、1个或多个字符串,所以里面也包含Captures对象的集合。并且因为Group继承于Capture,所以可以直接访问最后捕获的子字符串。
Group实例有如下两种返回情况。
1)Match.Groups(groupnum)属性返回。
2)Match.Groups(“groupname”)属性返回,此时使用“(?<groupname>)”分隔符。
看下面的一段代码:
在上述代码中,分别定义了检索对象rr的值是检索字符串“abc”、“ab”和“b”的组;然后通过嵌套分组构造将子字符串捕获到组中。具体执行结果如图11-15所示。
图11-15 实例执行结果
7.Capture
Capture类包含来自单个子表达式的捕获结果。例如在下面代码中,从Group中的每个成员中提取Capture集合,并且将变量pp和ll分配给找到的每一个字符串的初始字符串中的位置。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。