当前位置: 首页 > news >正文

C#正则表达式类Match和Group类的理解

      正则表达式可以看做一种有特定功能的小型编程语言,在一段文本中定位子字符串。利用正则表达式可以快速地分析大量的文本以找到特定的字符模式;提取、编辑、替换或删除文本子字符串;或将提取的字符串添加到集合。正则表达式的基本语法可参见:深入浅出之正则表达式(一),深入浅出之正则表达式(二)。

      C#命名空间System.Text.RegularExpressions提供了支持正则表达式操作的类。这些类主要包括Regex,MatchCollection,Match,GroupCollection,Group,CaputerCollection和Caputer,下图表示了这些类之间的关系。

 

      正则表达式很重要的一个应用就是在文本中提取字符串,这一功能的实现主要是靠Match类和Group类,因此理解匹配和组的概念很重要。要实现在一段文本中查找URL功能,这个例子比较简单,只要调用Regex.Matches()方法就可以找到URL的集合。示例代码如下:

ContractedBlock.gif ExpandedBlockStart.gif 文本中提取URL的
        public static void Main(string[] args)
        {           
            
string text = "I've found this amazing URL at http://www.sohu.com ,and then find ftp://ftp.sohu.com is better.";
            
string pattern = @"\b(\S+)://(\S+)\b";  //匹配URL的模式
            MatchCollection mc = Regex.Matches(text, pattern); //满足pattern的匹配集合
            Console.WriteLine("文本中包含的URL地址有:");
            
foreach (Match match in mc)
            {
                Console.WriteLine(match.ToString());
            }

            Console.Read();
        }
        
/* 
         * 运行后输出如下:
         * 文本中包含的URL地址有:
         * 
http://www.sohu.com
         * ftp://ftp.sohu.com
        
*/


      现在,要求变了,不仅要找出URL,还要找出每个URL的协议和域名地址,这时就要用到正则表达式的分组功能了。分组是要匹配的模式pattern用小括号括起来,分成不同的组,如可以把上面例子中的模式改为:string pattern = @"\b(?<protocol>\S+)://(?<address>\S+)\b"; 这样就用括号分成了两个组(实际上是三个组,因为匹配本身可以看做一个大组),"?<protocol>"和"?<address>"定义了每个组的别名protocol和address,这不是必须的,只是方便我们获取需要的组。示例代码如下:

ContractedBlock.gif ExpandedBlockStart.gif 提取URL协议和地址的示例
    public static void Main(string[] args)
    {
        
string text = "I've found this amazing URL at http://www.sohu.com ,and then find ftp://ftp.sohu.com is better.";
        
string pattern = @"\b(?<protocol>\S+)://(?<address>\S+)\b"//匹配URL的模式,并分组
        MatchCollection mc = Regex.Matches(text, pattern); //满足pattern的匹配集合

        Console.WriteLine(
"文本中包含的URL地址有:");
        
foreach (Match match in mc)
        {
            GroupCollection gc 
= match.Groups;
            
string outputText = "URL:" + match.Value + ";Protocol:" + gc["protocol"].Value + ";Address:" + gc["address"].Value;
            Console.WriteLine(outputText);
        }

        Console.Read();
    }
    
/**
     * 运行后输出如下:
     * 文本中包含的URL地址有:
     * URL:
http://www.sohu.com;Protocol:http;Address:www.sohu.com
     * URL:ftp://ftp.sohu.com;Protocol:ftp;Address:ftp.sohu.com
    
*/

      参考资料:正则表达式的妙用--获得数组,C#利用正则表达式搜索字符串,深入正则表达式

转载于:https://www.cnblogs.com/freshman0216/archive/2008/08/30/1262397.html

相关文章:

  • 声音音质评价专业述语
  • 使用Document_Handler_Example修改的注意事项
  • iptables 范例
  • 将asp.net站点转化为sharepoint站点
  • Silverlight是什么
  • Sqlite DateTime 类型 读取和写入格式 注意的问题
  • 文档知多少---走出软件作坊:三五个人十来条枪 如何成为开发正规军(二十五)...
  • 我在博客园里的第一篇文章
  • C#模拟网站用户登录
  • 平时关注.net今个儿用java做了个计算器.
  • FLEX:改变FLEX的默认LOADING效果-分别使用swf,PNG,gif
  • 婚礼
  • 快手 (KuaiShou.NET) 之账本应用
  • 三大搜索引擎 承诺“公正搜索”
  • MOSS Tip:如何更改文档库的SendTo菜单
  • 【从零开始安装kubernetes-1.7.3】2.flannel、docker以及Harbor的配置以及作用
  • Android单元测试 - 几个重要问题
  • JS函数式编程 数组部分风格 ES6版
  • Just for fun——迅速写完快速排序
  • vue-loader 源码解析系列之 selector
  • 初探 Vue 生命周期和钩子函数
  • 从零开始学习部署
  • 扑朔迷离的属性和特性【彻底弄清】
  • MyCAT水平分库
  • python最赚钱的4个方向,你最心动的是哪个?
  • 积累各种好的链接
  • ​什么是bug?bug的源头在哪里?
  • (WSI分类)WSI分类文献小综述 2024
  • (附源码)node.js知识分享网站 毕业设计 202038
  • (附源码)ssm基于微信小程序的疫苗管理系统 毕业设计 092354
  • (力扣)循环队列的实现与详解(C语言)
  • (小白学Java)Java简介和基本配置
  • (一)Thymeleaf用法——Thymeleaf简介
  • (原)记一次CentOS7 磁盘空间大小异常的解决过程
  • (转) Face-Resources
  • .[hudsonL@cock.li].mkp勒索加密数据库完美恢复---惜分飞
  • .gitignore文件设置了忽略但不生效
  • .helper勒索病毒的最新威胁:如何恢复您的数据?
  • .net refrector
  • .net 流——流的类型体系简单介绍
  • .NET 实现 NTFS 文件系统的硬链接 mklink /J(Junction)
  • .NET 使用 ILRepack 合并多个程序集(替代 ILMerge),避免引入额外的依赖
  • .Net 中的反射(动态创建类型实例) - Part.4(转自http://www.tracefact.net/CLR-and-Framework/Reflection-Part4.aspx)...
  • .NetCore 如何动态路由
  • @SuppressWarnings(unchecked)代码的作用
  • []常用AT命令解释()
  • [BZOJ3223]文艺平衡树
  • [C#基础]说说lock到底锁谁?
  • [Contiki系列论文之2]WSN的自适应通信架构
  • [EFI]Lenovo ThinkPad X280电脑 Hackintosh 黑苹果引导文件
  • [EULAR文摘] 脊柱放射学持续进展是否显著影响关节功能
  • [NOIP2014] 提高组 洛谷P1941 飞扬的小鸟
  • [Spark、hadoop]spark Streaming的核心DStream
  • [StartingPoint][Tier1]Crocodile
  • [svc]NFS存储企业场景及nfs最佳实战探究