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

C#实现正则表达式

  如果想了解正则表达式的基础知识:http://www.cnblogs.com/alvin-niu/p/6430758.html

一、C#中的Regex类

  1.在C#中开发正则表达式,首先要引用System.Text.RegularExpressions.Regex命名空间。

二、Regex中常用的方法

  此处先介绍一些Regex的静态方法。

  1.Match(String content,String pattern):在指定的输入字符串中搜索指定的正则表达式的第一个匹配项,

    content:要匹配的字符串。

    pattern:正则表达式。

    返回值:Match 对象。

  2.Match(String content,String pattern,RegexOption option):使用指定的匹配选项在输入字符串中搜索指定的正则表达式的第一个匹配项。

    option:指定的匹配选项,该项能大大提高匹配效率,在匹配量比较小的时候可以不需考虑。

枚举值详细说明
Compiled指定将正则表达式编译为程序集。 这会产生更快的执行速度,但会增加启动时间。
CultureInvariant指定忽略语言中的区域性差异
ECMAScript为表达式启用符合 ECMAScript 的行为。 可以使用此值仅在结合 IgnoreCase, ,Multiline, ,和 Compiled 值。 该值与其他任何值一起使用均将导致异常。
ExplicitCapture指定唯一有效的捕获是显式命名或编号的 (?<name>…) 形式的组。 这使未命名的圆括号可以充当非捕获组,并且不会使表达式的语法 (?:...) 显得笨拙。 如果不懂分组,可以先忽略,看下面的。
IgnoreCase指定不区分大小写的匹配。
IgnorePatternWhitespace消除模式中的非转义空白并启用由 # 标记的注释。 但是,此值不会影响或消除中的空白区域、 数值或标记的开头个人的令牌。
Multiline多行模式。 更改 ^ 和 $ 的含义,使它们分别在任意一行的行首和行尾匹配,而不仅仅在整个字符串的开头和结尾匹配。
None指定不设置任何选项。 这种也是默认的模式
RightToLeft指定搜索从右向左而不是从左向右进行。
Singleline指定单行模式。 更改点 (.) 的含义 使其匹配 (而不是除 \n 之外的所有字符) 的每个字符。

    返回值:Match 对象。

  3.Match(String content,String pattern,RegexOption option,TimeSpan ts):使用指定的匹配选项和超时间隔在输入字符串中搜索指定的正则表达式的第一个匹配项。

    ts:超时时间间隔。

    返回值:Match 对象。

在此处穿插一个知识点,Match 对象,但是只介绍常用的属性

  Match 对象:主要存放正则匹配之后的数据。

    Groups:获取由正则表达式匹配的组的集合。Groups[0]表示原字符串。Groups[1]才表示匹配的第一个分组的子字符串

    Index:在其中找到被捕获子串的第一个字符的原始字符串中的位置。

    Length:获取捕获的子字符串的长度。

    Name:返回由当前实例表示的捕获组的名称。

    Success:获取一个值,该值指示匹配是否成功。

    Value:从输入字符串中获取捕获的子字符串。

-----------------------------------------------------------------------------------------------

  4.IsMatch(String content,String pattern):表示是否匹配到相应的正则表达式,其重载方法与Match()一样

  5.Matches(String content,String pattern):在指定的输入字符串中搜索指定的正则表达式的多个匹配项,其重载方法与Match()一样

    返回值:MatchCollection 对象。该对象其实是Match的对象集合

    上述方法,是我在开发爬虫程序最常用的方法之一。在解析数据时,要匹配多个类似规律的数据。

  6.Replace(String content,String pattern,MatchEvaluator evaluator):在置顶的输入字符串搜索置顶的正则表达式的匹配项,在将evaluator委托的方法中,将返回替换了匹配的输入字符串。将原字符串中匹配项替换掉

    evaluator:委托对象,原型:public string MatchEvaluatorMethod(Match match);自定义方法返回替换了匹配的输入字符串。

  此处比较难懂,写个例子

  这个例子中主要体现了,只要在输入字符串中找到正则的匹配项,则执行委托的方法。该方法返回值会替换掉原来的匹配项。再接着搜索,直到替换掉所有的匹配项。该方法可以用到Match对象,但是此处例子为了简洁明了,则直接返回了一个字符串,和表示执行次数的count

using System;
using System.Collections;
using System.Text.RegularExpressions;

public class Test
{
    private static int count = 0;
    public static void Main()
    {
        string words = "TOM123456JACK654321Alvin90293";
        string pattern = @"\d+";
        MatchEvaluator evaluator = new MatchEvaluator(WordScrambler);
        Console.WriteLine("Original words:");
        Console.WriteLine(words);
        Console.WriteLine();
        Console.WriteLine("Scrambled words:");
        Console.WriteLine(Regex.Replace(words, pattern, evaluator));
        Console.ReadKey();
    }
    //委托的实现方法
    public static string WordScrambler(Match match)
    {
        count++;
        return "数字"+count;
    }
}
有关Replace()的例子

  7.Repalce()还有一些重载方法,其原理和Match()方法类似,懂的一个其他的自然就懂了,此处我列举一下就不一一说明了。

    Replace(String content,String pattern,MatchEvaluator evaluator,RegexOption option);

    Replace(String content,String pattern,MatchEvaluator evaluator,RegexOption option,TimeSpan ts);

    Replace(String content,String pattern,String newStr);该方法表示直接使用newStr替换匹配到的子字符串。

    Replace(String content,String pattern,String newStr,RegexOption option);

    Replace(String content,String pattern,String newStr,RegexOption option,TimeSpan ts);

  8.Split(String content,String pattern):在由正则表达式模式定义的位置将输入字符串拆分为一个子字符串数组

    其重载方法有:

    Split(String content,String pattern,RegexOption option);

    Split(String content,String pattern,RegexOption option,TimeSpan ts);

常用的就是这些静态方法,至于那些非静态方法,我至今还没有用到过,所以就不在此赘述了。下面给一个详细的例子:

 

三、实例

 

using System;
using System.Collections;
using System.Collections.Generic;
using System.Text.RegularExpressions;

public class Test
{
    public static void Main()
    {
        //匹配字符串中邮箱
        string pattern = @"\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*";
        string content = "qq邮箱:1234567@qq.com。网易邮箱:wangyi@163.com。公司邮箱:tom@gongsi.com.cn 。";
        Match result = Regex.Match(content,pattern);
        Console.WriteLine(result.Value);//匹配第一个 1234567@qq.com
        pattern = @":(\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*?)。";
        result = Regex.Match(content, pattern);
        Console.WriteLine(result.Value);//匹配结果 :wangyi@163.com。
        Console.WriteLine(result.Groups[0]);//匹配结果 :wangyi@163.com。
        Console.WriteLine(result.Groups[1]);//匹配结果 wangyi@163.com
        pattern = @"\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*";
        MatchCollection matches = Regex.Matches(content, pattern, RegexOptions.IgnoreCase);
        foreach (Match item in matches)
        {
            Console.WriteLine(item.Value);
        }
        Console.WriteLine(Regex.Replace(content,pattern,"The Email is ignore"));
        string [] array= Regex.Split(content,"[::。]");
        foreach (var item in array)
        {
            Console.WriteLine(item);
        }
        Console.ReadKey();
    }
}
以上所有知识点的例子

 

以上皆本人系统整理所学知识的笔记,与之共享。

转载于:https://www.cnblogs.com/alvin-niu/p/6430700.html

相关文章:

  • mitmproxy
  • tableView选择多项或单选
  • ip_conntrack table full dropping packet解决方案
  • Oracle for 循环
  • c++免注册大漠插件
  • 求上限值的整数勾股数
  • 微信小程序把玩(二十二)action-sheet组件
  • Python爬虫入门六之Cookie的使用
  • mysql学习笔记(二)--- MySQL数据类型
  • 【转】 android中的文件操作详解以及内部存储和外部存储
  • 03、常用类解析
  • 跟小博老师一起学JSP ——简介与工作原理
  • mysql中InnoDB引擎中页的概念
  • C# TCP多线程服务器示例
  • PyYAML序列化yaml文件数据
  • bearychat的java client
  • HashMap剖析之内部结构
  • HTML中设置input等文本框为不可操作
  • HTTP那些事
  • java8-模拟hadoop
  • Javascript弹出层-初探
  • JavaScript新鲜事·第5期
  • k个最大的数及变种小结
  • Node + FFmpeg 实现Canvas动画导出视频
  • Odoo domain写法及运用
  • PHP 使用 Swoole - TaskWorker 实现异步操作 Mysql
  • puppeteer stop redirect 的正确姿势及 net::ERR_FAILED 的解决
  • SpringCloud(第 039 篇)链接Mysql数据库,通过JpaRepository编写数据库访问
  • SQLServer插入数据
  • Sublime text 3 3103 注册码
  • 阿里中间件开源组件:Sentinel 0.2.0正式发布
  • 关于Flux,Vuex,Redux的思考
  • 关于for循环的简单归纳
  • 记一次用 NodeJs 实现模拟登录的思路
  • 开源地图数据可视化库——mapnik
  • 微信小程序--------语音识别(前端自己也能玩)
  • ​​​​​​​sokit v1.3抓手机应用socket数据包: Socket是传输控制层协议,WebSocket是应用层协议。
  • (TipsTricks)用客户端模板精简JavaScript代码
  • (分布式缓存)Redis持久化
  • (附源码)springboot家庭装修管理系统 毕业设计 613205
  • (附源码)ssm旅游企业财务管理系统 毕业设计 102100
  • (附源码)ssm学生管理系统 毕业设计 141543
  • (欧拉)openEuler系统添加网卡文件配置流程、(欧拉)openEuler系统手动配置ipv6地址流程、(欧拉)openEuler系统网络管理说明
  • (一)spring cloud微服务分布式云架构 - Spring Cloud简介
  • (轉貼) UML中文FAQ (OO) (UML)
  • ******之网络***——物理***
  • .describe() python_Python-Win32com-Excel
  • .Net 6.0 处理跨域的方式
  • .NET 将多个程序集合并成单一程序集的 4+3 种方法
  • .NET/C# 解压 Zip 文件时出现异常:System.IO.InvalidDataException: 找不到中央目录结尾记录。
  • .NET6使用MiniExcel根据数据源横向导出头部标题及数据
  • .NET大文件上传知识整理
  • .net获取当前url各种属性(文件名、参数、域名 等)的方法
  • .net实现头像缩放截取功能 -----转载自accp教程网
  • .Net下C#针对Excel开发控件汇总(ClosedXML,EPPlus,NPOI)