3. 相关类与其成员
[serializable]
public class Regex : ISerializable
// 表示不可变的正则表达式。
regex 类包含若干静态方法,使您无需显式创建 Regex 对象即可使用正则表达式。使用静态方法等效于构造 Regex 对象,使用该对象一次然后将其销毁。
regex 类是不可变(只读)的,并且具有固有的线程安全性。可以在任何线程上创建 Regex 对象,并在线程间共享。
以上摘自微软的开发文档。我们还需要用到它的几个成员:
// 在指定的输入字符串中搜索 Regex 构造函数中指定的正则表达式匹配项。
public Match Match(
string intput
)
对于 Match 类
[serializable]
public class Match : Group
// 表示单个正则表达式匹配的结果。有关 Group 的详细信息请参见微软开发文档。
我们会用到它的下列成员
// 原始字符串中发现捕获的子字符串的从零开始的起始位置。
public int Index { get; }
// 捕获的子字符串的长度。
public int Length { get; }
// 通过匹配捕获的实际子字符串。
public int Value { get; }
// 获取一个值,该值指示匹配是否成功。
public bool Success { get; }
// 获取由正则表达式匹配的组的集合。
public virtual GroupCollection Groups { get; }
// 从上一个匹配结束的位置(即在上一个匹配字符之后的字符)开始
// 返回一个包含下一个匹配结果的新 Match。
public Match NextMatch();
以及 Group 类的相应成员(上面列出的 Match 的成员中,前四个属性都是由 Group 类继承而来,因此这些成员将不再一一列出)。
匹配字符串必须在 Regex 类的实例初始化的时候指定。你可以使用构造函数创建一个实例,使用它,然后销毁它。或者直接使用静态方法,这等效于创建实例。不过,经过测试,我发现静态方法要稍稍慢于编译的 Regex 对象。请看下面的一组测试数据:
4. 撰写代码
我们现在需要对第三节中列出的c#语言元素进行分析。我所采取的是逐行分析(如果要采取多行分析,则相关表达式需要进行修改 )。
using System.Text.RegularExpression;
// Some other codes
// 首先创建 Regex 实例(以字符串的解析为例)。
regex DoubleQuotedString = new Regex( "\"(\\\\?.)*?\"" );
// 然后去匹配字符串。
match m;
for( m = DoubleQuotedString.Match( strSomeCodes ) ; m.Success ; m.NextMatch() ) {
foreach( Group g in m.Groups ) {
// Do some drawings
}
}
剩下的事就是写着色代码了。
5. 源代码 http://www.pscode.com/vb/scripts/ShowZip.asp?lngWId=10&lngCodeId=2611&strZipAccessCode=tp%2FS26112472
注:
"能够……文本模式" 引自 .NET Framework 常规参考 中的 正则表达式语言元素
正则表达式简介 此处有关正则表达式的简介参考自 ZDNet China 技术与开发 中的相关内容。
本节中出现的类与函数的签名与注释均出自微软文档。
多行分析 详情请参见 .NET Framework 常规参考 正则表达式语言元素