ECMAScript 无 指定已为表达式启用了符合 ECMAScript 的行为。此选项仅可和 IgnoreCase 和 Multiline 标志一起使用。将 ECMAScript 同任何其他标志一起使用将导致异常。
例如,Find_po在字开头处查找以"po"开头的字符串:
static void Find_po()
{
string text = @" I can not find my position in Beijing ";
string pattern = @"\bpo\S*ion\b";
MatchCollection matches = Regex.Matches(text, pattern, RegexOptions.IgnoreCase
RegexOptions.IgnorePatternWhitespace RegexOptions.ExplicitCapture);
WriteMatches(text, matches);
}
这段代码还使用了名称空间RegularExpressions:
using System;
using System.Text.RegularExpressions;
4.4 匹配、组和捕获
一般表达式的一个很好的特性是能够把字符组合起来,方式和C#中的复合语句相同。在C#中,能够通过把任意数量的语句放在花括号中的方式把他们组合在一起。其结果就像一个复合语句那样。在一般表达式模式中,也能够把任何字符组合起来(包括元字符和转义序列),像处理一个字符那样处理他们。唯一的区别是要使用圆括号,而不是花括号,得到的序列成为一个组。
例如,模式"(an) "定位序列an的任以重复。量词 只应用于他前面的一个字符,但因为我们把字符组合起来了,所以他现在把重复的an作为一个单元来对待。"(an)."应用到输入文本"bananas came to Europe late in the annals of history"上,会从bananas中选择出anan。另一方面,假如使用an ,则将从annals中选择ann,从bananas中选择出两个an。为什么(an) 选择的是anan,而没有把单个的an作为一个匹配。匹配规则是不能重复的,假如有可能重复,在默认情况下就选择较长的匹配。
但是,组的功能要比这强大得多。在默认情况下,把模式的一部分组合为一个组时,就需要一般表达式引擎记住能够按照这个组来匹配,也能够按照整个模式来匹配。换言之,能够把组当作一个要匹配的模式,假如要把字符串分解为各个部分,这种模式就是很有效的。
例如,URI的格式是" :// : ",其中端口是可选的。他的一个样例是http://www.comprg.com.cn:8080。假定要从一个URI中提取协议、地址和端口,而且紧邻URI的后面可能有空白(但没有标点符号),就能够使用下面的表达式:"\b(\S )://(\S )(?::(\S ))?\b"
该表达式的工作方式如下:首先,前导和尾部的\b序列确保只需要考虑完全是字的文本部分,在这个文本部分中,第一组"(\S )://"会选择一个或多个不适空白的字符,其后是"://"。在HTTPURI的开头会选择出http://。花括号表示把http存储为一个组。后面的"(\S )"则在上述URI中选择www. comprg.com.cn,这个组在碰到词的结尾时或标记另一个组的冒号"(:)"时结束。
下一个组选择端口(本例是:8080)。后面的?表示这个组在匹配中是可选的,假如没有:xxxx,也不会妨碍匹配的标记。
这是很重要的,因为端口在URI中一般不指定,实际上,在大多数情况下,URI是没有端口号的。但是,事情会比较复杂。假如需要冒号能够出现,也能够不出现,但不希望把这个冒号也存储在组中。为此,能够嵌套两个组:内部的"(\S )"组选择冒号后面的内容(本例中是8080),外面的组包含内部的组,后面是个冒号,该冒号又在序列"?:"的后面。这个序列表示该组不应保存(只需要保存"8080",无需保存":8080")。不要把这两个冒号混淆了,第一个冒号是序列"?:"的一部分,表示不保存这个组,第二个冒号是要搜索的文本。
在这个字符串上运行该模式:I always visit http://www. comprg.com.cn 得到的匹配是http://www. comprg.com.cn。在这个匹配中,仅提到了三个组,更有第四个组表示匹配本身。理论上,每个组都能够选择0次、1次或多次匹配。单个的匹配就称为捕获。在第一个组"(\S )",有一个捕获http。第二个组也有一个捕获www. comprg.com.cn,但第三个组没有捕获,因为在这个URI中没有端口号。注意该字符串在其本身上包含第二个http://。虽然他匹配于第一个组,但不会被搜索出来,因为整个搜索表达式不匹配于这部分文本。
再比如下面这个例子,以下代码示例使用 Match.Result 来从 URL提取协议和端口号。例如,"http://www.yahoo.com.cn:8080/index.html"将返回"http:8080"。
String Extension(String url)
{
Regex r = new Regex(@"^(? \w )://[^/] ?(? :\d )?/",
RegexOptions.Compiled);
return r.Match(url).Result("${proto}${port}");
}
5、小结
.NET 框架正则表达式类是基类库的一部分,并且能够和面向公共语言运行库的任何语言或工具(包括 ASP.NET和 Visual Studio .NET)一起使用。本文给出了在C#下利用正则表达式实现字符串搜索功能的方法,通过对.NET框架下的正则表达式的研究及实例分析,总结了正则表达式的规则、选项等,方便以后朋友们的应用。
http://www.cnblogs.com/tanghuawei/archive/2006/10/05/521487.html
文章整理:西部数码--专业提供域名注册、虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!




