设为首页  
联系我们  
加入收藏  
网页制作 冲浪宝典 图形图像 操作系统 软件教学 编程开发 认证考试 安全技术 站长专区 文学驿站 娱乐天地 游戏天地 办公软件
文章搜索
您的位置: 首页 >> 文章首页 >> 编程开发 >> 网络编程 >> C#应用 >> C#利用正则表达式实现字符串搜索
精品推荐
C#应用点击TOP10
·c#操作word表格
·用C#实现木马程序
·C#操作xml文件入门
·C#反射实例讲解
·C#编写的windows计算器-源代码
·在C#中应用哈希表(Hashtable)
·C#中连接DataTable的方法
·C#实现Word中表格信息读取
·c#中的委托和事件的简单实例
·用C#程序监控并显示CPU状态信息
网络编程点击TOP10
·ASP.NET 程序中常用的三十三种代码
·CHK文件恢复工具
·.NET 初 级 读 本
·c#操作word表格
·我的.NET书架 (入门篇)
·『原创』C#中TreeView类操作全攻略:建立树,新增节点,删除节点,修改节点,拖动节点,与Oracle数据库交互操作(一)
·从零开始学ASP.NET(基础篇)
·用C#实现木马程序
·十天学会ASP.net之第一天
·官方水晶报表 .NET 应用程序实例下载 (C#、Visual C++.NET)
精选专题

C#利用正则表达式实现字符串搜索

作者: 来源:http://www.xgdown.com/ 时间:2006-12-13 12:01:50

C#利用正则表达式实现字符串搜索(3) 表1:特定字符或转义序列

  

  特定字符或转义序列 含义 样例 匹配的样例

  ^ 输入文本的开头 ^B B,但只能是文本中的第一个字符

  $ 输入文本的结尾 X$ X,但只能是文本中的最后一个字符

  . 除了换行字符(\n)以外的所有单个字符 i.ation isation、ization

  * 可以重复0次或多次的前导字符 ra*t rat、raat等

  + 可以重复1次或多次的前导字符 ra+t rt、rat、raat等

  ? 可以重复0次或1次的前导字符 ra?t 只有rt和rat匹配

  \s 任何空白字符 \sa [space]a,\ta,\na(\t和\n与C#的\t和\n含义相同)

  \S 任何不是空白的字符 \SF aF,rF,cF,但不能是\tf

  \b 字边界 ion\b 以ion结尾的任何字

  \B 不是字边界的位置 \BX\B 字中间的任何X

  如果要搜索一个元字符,也可以通过带有反斜杠的转义字符来表示。例如,.表示除了换行字符以外的任何字符,而\.表示一个点。

  可以把可替换的字符放在方括号中,请求匹配包含这些字符。例如,[1 c]表示字符可以是1或者是c。如果要搜索map或者man,可以使用序列"ma[n p]"(仅指引号内字符,下面雷同)。在方括号中,也可以制定一个范围,例如"[a-z]"表示所有的小写字母(使用连字号 (-) 允许指定连续字符范围),"[B-F]"表示B到F之间的所有大写字母,"[0-9]"表示一个数字,如果要搜索一个整数(该序列只包含0到9的字符),就可以编写"[0-9]+"(注意,使用+字符表示至少要有这样一个数字,但可以有多个数字,所以9、83和3443等都是匹配的。)

  下面看看一般表达式的结果,编写一个实例RegularExpressionsZzy。建立几个一般表达式,显示其结果,让用户了解一下表达式是如何工作的。

  该实例的核心是一个方法WriteMatches(),它把MatchCollection中的所有匹配以比较详细的方式显示出来。对于每个匹配,它都会显示该匹配在输入字符串中所在的索引,匹配的字符串和一个略长的字符串,其中包含输入文本中至多8个外围字符,其中至少有5个字符放在匹配的前面,至多5个字符放在匹配的后面(如果匹配的位置在输入文本的开头或结尾5个字符内,则结果中匹配前后的字符就会少于4个)。换言之,靠近输入文本末尾的匹配应是"and messaging ofd",匹配的前后各有5个字符,但位于输入文本的最后一个字上的匹配就应是"g of data",匹配的字后只有一个字符。因为在该字符的后面是字符串的结尾。这个长字符串可以更清楚地表明一般表达式是在什么地方查找到匹配的:

  

  static void WriteMatches(string text, MatchCollection matches)

  {

   Console.WriteLine("Original text was: \n\n" + text + "\n");

   Console.WriteLine("No. of matches: " + matches.Count);

   foreach (Match nextMatch in matches)

   {

    int Index = nextMatch.Index;

    string result = nextMatch.ToString();

    int charsBefore = (Index < 5) ? Index : 5;

    int fromEnd = text.Length - Index - result.Length;

    int charsAfter = (fromEnd < 5) ? fromEnd : 5;

    int charsToDisplay = charsBefore + charsAfter + result.Length;

    Console.WriteLine("Index: {0}, \tString: {1}, \t{2}",Index, result,

    text.Substring(Index - charsBefore, charsToDisplay));

   }

  }

  在这个方法中,处理过程是确定在较长的字符串中有多少个字符可以显示,而无需超限输入文本的开头或结尾。注意在Match对象上使用了另一个属性Value,它包含标识该匹配的字符串,而且,RegularExpressionsZzy只包含名为Find_po,Find_n等的方法,这些方法根据本文执行某些搜索操作。

  4.3 正则表达式选项

  可以使用影响匹配行为的选项修改正则表达式模式。可以通过两种基本方法设置正则表达式选项:其一是可以在 Regex(pattern, options) 构造函数中的 options 参数中指定,其中 options 是 RegexOptions 枚举值的按位"或"组合;其二是使用内联 (?imnsx-imnsx:) 分组构造或 (?imnsx-imnsx) 其他构造在正则表达式模式内设置它们。

  在内联选项构造中,一个选项或一组选项前面的减号 (-) 用于关闭这些选项。例如,内联构造 (?ix-ms) 将打开 IgnoreCase 和 IgnorePatternWhiteSpace 选项而关闭 Multiline 和 Singleline 选项。

  表2:RegexOptions 枚举的成员以及等效的内联选项字符

  

  RegexOption 成员 内联字符 说明

  None 无 指定不设置任何选项。

  IgnoreCase i 指定不区分大小写的匹配。

  Multiline m 指定多行模式。更改 ^ 和 $ 的含义,以使它们分别与任何行的开头和结尾匹配,而不只是与整个字符串的开头和结尾匹配。

  ExplicitCapture n 指定唯一有效的捕获是显式命名或编号的 (?...) 形式的组。这允许圆括号充当非捕获组,从而避免了由 (?:...) 导致的语法上的笨拙。

  Compiled 无 指定正则表达式将被编译为程序集。生成该正则表达式的 Microsoft 中间语言 (MSIL) 代码;以较长的启动时间为代价,得到更快的执行速度。

  Singleline s 指定单行模式。更改句点字符 (.) 的含义,以使它与每个字符(而不是除 \n 外的所有字符)匹配。

  IgnorePatternWhitespace x 指定从模式中排除非转义空白并启用数字符号 (#) 后面的注释。请注意,空白永远不会从字符类中消除。

  RightToLeft 无 指定搜索是从右向左而不是从左向右进行的。具有此选项的正则表达式将移动到起始位置的左边而不是右边。(因此,起始位置应指定为字符串的结尾而不是开头。)为了避免构造具有无限循环的正则表达式的可能性,此选项不能在中流指定。但是,(?<) 回顾后发构造提供了可用作子表达式的类似替代物。

  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框架下的正则表达式的研究及实例分析,总结了正则表达式的规则、选项等,方便以后朋友们的应用。

共4页 9 7 [1] [2] [3] [48 :>

C#利用正则表达式实现字符串搜索 相关文章:
C#利用正则表达式实现字符串搜索 相关软件:
特别声明:本站除部分特别声明禁止转载的专稿外的其他文章可以自由转载,但请务必注明出处和原始作者。文章版权归文章原始作者所有。对于被本站转载文章的个人和网站,我们表示深深的谢意。如果本站转载的文章有版权问题请联系编辑人员,我们尽快予以更正。
转载请注明来源:http://www.xgdown.com