using System;
using System.Text.RegularExpressions;
public class RegexTest
{
public static void RunTest()
{
int counter;
Match m;
CaptureCollection cc;
GroupCollection gc;
Regex r = new Regex("(Abc) "); //查找"Abc"
m = r.Match("XYZAbcAbcAbcXYZAbcAb"); //设定要查找的字符串
gc = m.Groups;
//输出查找组的数目
Console.WriteLine("Captured groups = " gc.Count.ToString());
// Loop through each group.
for (int i=0; i < gc.Count; i ) //查找每一个组
{
cc = gc[i].Captures;
counter = cc.Count;
Console.WriteLine("Captures count = " counter.ToString());
for (int ii = 0; ii < counter; ii )
{
// Print capture and position.
Console.WriteLine(cc[ii] " Starts at character "
cc[ii].Index); //输入捕获位置
}
}
}
public static void Main() {
RunTest();
}
}
此例返回下面的输出结果:
Captured groups = 2
Captures count = 1
AbcAbcAbc Starts at character 3
Captures count = 3
Abc Starts at character 3
Abc Starts at character 6
Abc Starts at character 9
3.6 Capture 类包含来自单个子表达式捕获的结果
在 Group 集合中循环,从 Group 的每一成员中提取 Capture 集合,并且将变量 posn 和 length 分别分配给找到每一字符串的初始字符串中的字符位置,连同每一字符串的长度。
Regex r;
Match m;
CaptureCollection cc;
int posn, length;
r = new Regex("(abc)*");
m = r.Match("bcabcabc");
for (int i=0; m.Groups[i].Value != ""; i )
{
cc = m.Groups[i].Captures;
for (int j = 0; j < cc.Count; j )
{
posn = cc[j].Index; //捕获对象位置
length = cc[j].Length; //捕获对象长度
}
}
把组合字符组合起来后,每次都会返回一个组对象,就可能并不是我们希望的结果。假如希望把组合字符作为搜索模式的一部分,就会有相当大的系统开销。对于单个的组,能够用以字符序列"?:"开头的组禁止这么做,就像URI样例那样。而对于任何的组,能够在RegEx.Matches()方法上指定RegExOptions.ExplicitCapture标志。
4、利用正则表达式实现字符串搜索
4.1 在C#中使用.NET一般表达式引擎
下面将通过一个样例的研发,执行并显示一些搜索的结果,说明一般表达式的一些特性,连同如何在C#中使用.NET一般表达式引擎。说明使用字符串时应在前面加上符号@。
String Text=@"I can not find my position in Beijing";
把这个文本称为输入字符串,为了说明一般表达式.NET类,本文先进行一次纯文本的搜索,这次搜索不带任何转义序列或一般表达式命令。假定要查找任何字符串ion,把这个搜索字符串称为模式。使用一般表达式和上面声明的变量Text,编写出下面的代码:
String Pattern = "ion";
MatchCollection Matches = Regex.Matches(Text,Pattern,RegexOptions);
foreach(Match NextMatch in Matches)
{ Console.WriteLine(NextMatch.Index); }
在这段代码中,使用了System.Text.RegularExpressions名称空间中Regex类的静态方法Match()。这个方法的参数是一些输入文本、一个模式和RegexOptions每句中的一组可选标志。Matches()返回MatchCollection,每个匹配都用一个Match对象来表示。在上面的代码中,只是在集合中迭代,使用Match类的Index属性,返回输入文本中匹配所在的索引。运行这段代码,将得到1个匹配项。
一般集合的功能主要取决于模式字符串。原因是模式字符串不但仅包含纯文本。如前所述。还包含元字符和转义序列,元字符是给出命令的特别字符,而转义序列的工作方式和C#的转义序列相同,他们都是以反斜杠\开头的字符,具备特别的含义。例如,假定要查找以n开头的字,就能够使用转义序列\b,他表示一个字的边界(字的边界是以某个字母数字标的字符开头,或后面是个空白字符或标点符号),下面编写如下代码:
String Pattern = @"\bn";
MatchCollection Matches = Regex.Matches(Text,Pattern,RegexOptions.IgnoreCase
RegexOptions.ExplicitCapture);
要在运行时把\b传递给.NET一般表达式引擎,反斜杠\不应被C#编译器解释为转义序列。假如要查找以序列ion结尾的字,能够使用下面的代码:
String Pattern = @"ion\b";
假如要查找以字母n开头,以序列ion结尾的任何字,需要一个以\bn开头,以ion\b结尾的模式,中间内容怎么办?需要告诉电脑n和ion中间的内容能够是任意长度的字符,只要字符不是空白即可,正确的模式如下所示:
String Pattern = @"\bn\S*ion\b";
4.2 特定字符或转义序列
大多数重要的正则表达式语言运算符都是非转义的单个字符。转义符 \(单个反斜杠)通知正则表达式分析器反斜杠后面的字符不是运算符。例如,分析器将星号 (*) 视为重复限定符,而将后跟星号的反斜杠 (\*) 视为 Unicode 字符 002A。
文章整理:西部数码--专业提供域名注册、虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!




