一种十分强大的处理文本信息的工具。
正则表达式提供功能强大、用法灵活以及高效处理文本的方法,正则表达式的全面模式匹配表示法使您可以快速分析大量文本以找到特定的字符模式;验证文本以确保它匹配预定义的模式(如电子邮件地址);提取、编辑、替换或删除文本子字符串;将提取的字符串添加到集合以生成报告。
1 正则表达式工作方式
在以前的认知中,对于文本的处理,基本可以归为对字符串的处理,而对字符串的处理一般有查找、替换(插入是特殊的替换)和取子字符串,而完成这些功能的最终方法就是比较字符串是否相同。现在有了正则表达式这个高级工具,它的高级之处在于可以定义通配字符串,即用来匹配的字符串的一般形式,比如用\d 表示十进制数字,并且将用来完成匹配功能的若干函数,全部定义到 Regex 类中,由其统一处理匹配的若干事宜。
将统一处理匹配的类称为正则表达式引擎,在使用时需要提供两个信息,可以理解为接收两个参数来完成初始化。一个是前面提到的通用匹配字符串,一个是要匹配的文本。
正则表达式引擎中若干种方法,可以归纳为以下几种功能:
(1)通过调用 IsMatch方法确定输入文本中是否具有正则表达式模式匹配项。
(2)通过调用 Match 或 Matches 方法检索匹配正则表达式模式的一个或所有文本匹配项。
(3)通过调用 Replace方法替换匹配正则表达式模式的文本。
以下使用一个简单示例用以说明如何使用正则表达式,及其如何工作。其首先定义并实例化通用匹配字符串 pattern,然后给出了用来匹配的文本 names 字符串数组,接着调用静态 Replace 方法,便实现了将姓名前的称呼字符串去除,程序如下。
public class Example
{
public static void Main()
{
string pattern = "(Mr\\.? |Mrs\\.? |Miss |Ms\\.? )";
string[] names = { "Mr. Henry Hunt", "Ms. Sara Samuels",
"Abraham Adams", "Ms. Nicole Norris" };
foreach (string name in names)
Console.WriteLine(Regex.Replace(name, pattern, String.Empty));
}
}
输出结果如下。
Henry Hunt
Sara Samuels
Abraham Adams
Nicole Norris
2 正则表达式对象模型
在学习面向对象之前,处理匹配的方式不外乎方法调用。由于 C# 是面向对象的,其自然也将面向对象的思想引入至正则表达式。
在叙述正则表达式对象模型之前,得先介绍捕获组这个概念,捕获组是相对于通用匹配字符串提出的,在通用匹配字符串中使用小括号将其中的一些字符括起来成为一个捕获组。可以这样形象的理解,首先用整个通用匹配字符串进行匹配,然后接着使用捕获组进行匹配,也就是说有人为了偷懒将多条通用匹配字符串写到一条中,前提是这一条包含其它的几条,而且使用小括号作为标记符,用以说明这是一组。
使用 Regex 类的 Match 方法进行单个正则表达式匹配,匹配返回 Match 类型对象;
如果该该正则表达式可以进行多次匹配,那么将会有多个 Match 类型对象返回,于是使用MatchCollection 类型对象保存多个 Match 类型对象,即MatchCollection 类型对象作为单个Match 类型对象的集合,可以使用Regex 类的Matchs 方法返回MatchCollection 类型对象;
由于当个正则表达式中存在捕获组(可以看作小的单个正则表达式),在正则表达式进行匹配时,捕获组也会进行匹配,于是使用Match 类的Group 类型对象存储;
在这里为了后续工作的方便进行,定义了同 Group 类型功能相同的Group 类的Capture 类型,用以存储捕获组的一次匹配;
同理,捕获组也可能进行多次匹配,其结果则使用 CaptureCollection 类型存储;
又如,捕获组可能有多组,其结果则使用 GroupCollection 类型存储,相应的可以使用Match.Groups 属性返回GroupCollection 类型对象。
最后对于,Match 类的 Group 类型是存储与 Capture类型相同的对象,但如果某个捕获组有多次捕获,则将最后一次捕获结果放在Group 类型中,具体对应程序是match.Groups[0].Value表示的值。
可以参考图1进行理解,其中名称基本是去类或方法单层首字母,双箭头表返回类型,单箭头指向该类型的上一层结构(就是该类型的集合),等号表其至少在功能上是等价的或可以存储同一类型的值。
图1 对象模型实例
程序示例如下。
static void Main(string[] args)
{
string pattern;
string input = "abcd||aababcabcd";
// Match a word with a pattern that has no capturing groups.
pattern = @"((((a)+b)+c)+d)+";
foreach (Match match in Regex.Matches(input, pattern))
{
Console.WriteLine("{0} {1}", match.Value, match.Groups.Count);
for (int groupCtr = 0; groupCtr < match.Groups.Count; groupCtr++)
{
Console.WriteLine(" Group {0}: '{1}'", groupCtr, match.Groups[groupCtr].Value);
Console.WriteLine(" Group({0}).Captures: {1}",
groupCtr, match.Groups[groupCtr].Captures.Count);
for (int captureCtr = 0; captureCtr < match.Groups[groupCtr].Captures.Count; captureCtr++)
Console.WriteLine(" Capture {0}: '{1}'", captureCtr, match.Groups[groupCtr].Captures[captureCtr].Value);
}
}
}
程序结果如下。
abcd 5
Group 0: 'abcd'
Group(0).Captures: 1
Capture 0: 'abcd'
Group 1: 'abcd'
Group(1).Captures: 1
Capture 0: 'abcd'
Group 2: 'abc'
Group(2).Captures: 1
Capture 0: 'abc'
Group 3: 'ab'
Group(3).Captures: 1
Capture 0: 'ab'
Group 4: 'a'
Group(4).Captures: 1
Capture 0: 'a'
aababcabcd 5
Group 0: 'aababcabcd'
Group(0).Captures: 1
Capture 0: 'aababcabcd'
Group 1: 'aababcabcd'
Group(1).Captures: 1
Capture 0: 'aababcabcd'
Group 2: 'abc'
Group(2).Captures: 2
Capture 0: 'aababc'
Capture 1: 'abc'
Group 3: 'ab'
Group(3).Captures: 3
Capture 0: 'aab'
Capture 1: 'ab'
Capture 2: 'ab'
Group 4: 'a'
Group(4).Captures: 4
Capture 0: 'a'
Capture 1: 'a'
Capture 2: 'a'
Capture 3: 'a'
该正则表达式成功的执行了两次匹配,返回了两个 Match对象;在每个 Match 对象中包含5个 Group 对象,对应每个 Group 对象有若干干相应的 Capture 对象;其中第1个(零下标处)Group 放置最后一次捕获的Group 对象。
3 正则表达式语言
正则表达式语言包含以下部分。
字符转义:正则表达式中的反斜杠字符(\)指示其后跟的字符是特殊字符,或应按原义解释该字符。
如\a与报警 (bell) 符 \u0007 匹配。\b在字符类中,与退格键\u0008 匹配。
字符类:字符类与一组字符中的任何一个字符匹配。
如\s与任何空白字符匹配。\d与任何十进制数字匹配。
定位点:定位点或原子零宽度断言会使匹配成功或失败,具体取决于字符串中的当前位置,但它们不会使引擎在字符串中前进或使用字符。
如^匹配必须从字符串或一行的开头开始。\A匹配必须出现在字符串的开头。
分组构造:分组构造描述了正则表达式的子表达式,通常用于捕获输入字符串的子字符串。
如(subexpression)捕获匹配的子表达式并将其分配到一个从零开始的序号中。
限定符:限定符指定在输入字符串中必须存在上一个元素(可以是字符、组或字符类)的多少个实例才能出现匹配项。
如*匹配上一个元素零次或多次。+匹配上一个元素一次或多次。
反向引用构造:反向引用允许在同一正则表达式中随后标识以前匹配的子表达式。
如\ number后向引用。 匹配编号子表达式的值。
替换构造:替换构造用于修改正则表达式以启用 either/or 匹配。
替换:替换是替换模式中支持的正则表达式语言元素。
正则表达式选项:可以指定控制正则表达式引擎如何解释正则表达式模式的选项。
其他构造:其他构造可修改某个正则表达式模式或提供有关该模式的信息。
有关更加详细的叙述,可以查看 C# 编程指南。
4 参考
C# 编程指南
C# 自学手册
http://blog.csdn.net/chenanlin1981/article/details/845761