一分钟学会(一):.NET之正则表达式

本文介绍正则表达式在.NET中的基本应用,代码简单粗暴,实例浅显易懂,让你一分钟快速上手正则(大鸟请略过)。

本文为入门文章,很多时候我们只是忘记了语法,这也可作为一个快速查询的参考。 如果想深入学习正则表达式高级功能请参考其他资料

=========首先引入命名空间 using System.Text.RegularExpressions;

//1.查找
        static void Test1()
        {
            Console.WriteLine("=========Match方法匹配第一个===========");
            Regex regex = new Regex(@"\d{3}"); //@ 表示不用进行转义 \在.NET中是转义符 此表达式等同于 \\d{3}
            Match m = regex.Match("this is an apple 123 456 9999");
            Console.WriteLine(m);

            Console.WriteLine("=========Matches方法匹配所有===========");
            MatchCollection matches = regex.Matches("this is an apple 123 456 9999");
            foreach(Match match in matches)
            {
                Console.WriteLine(match);
            }

            Console.WriteLine("=========IsMatch检查匹配是否成功===========");
            bool result = regex.IsMatch("this is an apple 123 456 9999");
            Console.WriteLine(result);
        }

结果:=========

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

//2.替换操作
        static void Test2()
        {
            //替换所有匹配项
            Regex regex = new Regex("apple");
            string result = regex.Replace("this is an apple,apple,apple", "苹果");
            Console.Write(result);
        }

结果:=========

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

 //3.使用委托
        static void Test3()
        {
            string result = Regex.Replace("1 2 3 4 5",@"\d+", new MatchEvaluator(
                delegate(Match match) {//匿名方法
                    return "0" + match.Value;
                }
            ),RegexOptions.IgnoreCase|RegexOptions.Singleline);
            //最后一个参数匹配模式 可选
            Console.WriteLine(result);
        }

结果:=========

简单说明一下,Replace方法可以传入一个委托,对匹配结果自定义处理,new MatchEvaluator(delegate),delegate为方法名,Match作为参数传入, 这里使用了匿名方法。

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

 //4.$number 使用表达式替换匹配结果中的 number 组  $1表示组1匹配的结果
        static void Test4()
        {
            string result = Regex.Replace("1 2 3 12 13", @"(\d)(\d)", "A$1");
            Console.WriteLine(result);
        }

上面的正则表达式有两个分组 (\d) 和 (\d) 匹配结果如下图所示

Replace方法第三个参数 A$1 中的$1 表示使用 匹配结果中Group_1 的值 替换 字符串中所有匹配项 所以 A1替换 12 ,A1替换13 结果如下

如果参数换为 abc$2  表示使用匹配结果中 Group_2 的值 替换字符串中所有匹配项 所以 abc2替换 12 ,abc3替换13 结果如下

此处比较绕口,实在不明白请自行敲一下代码。

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

//5.${name} 使用表达式替换匹配结果中的 name 组  ${name}表示组名为name匹配的结果 ?<name> 给改组命名为name
        static void Test5() {
            string result = Regex.Replace("1 2 3 12 13", @"(\d)(?<name>\d)", "A${name}");
            Console.WriteLine(result);

        }
        //补充
        //$$ $转义符
        //$& 替换整个匹配
        //$^ 替换匹配前的字符
        //$‘ 替换匹配后的字符
        //$+ 替换最后匹配的组
        //$_ 替换整个字符串
        //(?#这个是注释)  正则内联注释语法 (?#注释)

给分组命名使用  ?<name> 如下图 命名以后Group_2 的组名为:name ,${name} 和上一节的$1类似 一个用编号引用 一个用名字引用

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

//6.1分组
        static void Test6()
        {
            string s = "2005-2-21";
            Regex reg = new Regex(@"(?<y>\d{4})-(?<m>\d{1,2})-(?<d>\d{1,2})", RegexOptions.Compiled);
            Match match = reg.Match(s);

            int year = int.Parse(match.Groups["y"].Value);
            int month = int.Parse(match.Groups["m"].Value);
            int day = int.Parse(match.Groups["d"].Value);

            DateTime time = new DateTime(year, month, day);
            Console.WriteLine(time);
            Console.ReadLine();

            //DateTime.Parse(s);
        }

上面的代码可以用 DateTime.Parse(s) 实现,这里为了展示如何给分组命名和取值

=========

//6.2
        static void Test7()
        {
            string s = "2005-2-21";
            Regex reg = new Regex(@"(\d{4})-(\d{1,2})-(\d{1,2})", RegexOptions.Compiled);
            Match match = reg.Match(s);

            int year = int.Parse(match.Groups[1].Value);
            int month = int.Parse(match.Groups[2].Value);
            int day = int.Parse(match.Groups[3].Value);

            DateTime time = new DateTime(year, month, day);
            Console.WriteLine(time);
            Console.ReadLine();
        }

未命名的分组可以直接用编号取得 Groups[1],Groups[2],Groups[3]

=======

//6.3
        static void Test8()
        {
            string s = "2005-2-21";
            Regex reg = new Regex(@"(?<2>\d{4})-(?<1>\d{1,2})-(?<3>\d{1,2})", RegexOptions.Compiled);
            Match match = reg.Match(s);

            int year = int.Parse(match.Groups[2].Value);
            int month = int.Parse(match.Groups[1].Value);
            int day = int.Parse(match.Groups[3].Value);

            DateTime time = new DateTime(year, month, day);
            Console.WriteLine(time);
            Console.ReadLine();
        }

Groups[2] 这里的 2代表的是名字 而不是编号

===========================================================================

看到这里相信你对.NET中如何使用正则有了一个基本的认识, Regex类提供了很多静态的方法可以直接调用,很多时候可以不需要实例化。

//全部代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using System.Text.RegularExpressions;
namespace demo
{
    class Program
    {
        static void Main(string[] args)
        {
            Test6();

            Console.ReadLine();
        }

        //1.查找
        static void Test1()
        {
            Console.WriteLine("=========Match方法匹配第一个===========");
            Regex regex = new Regex(@"\d{3}"); //@ 表示不用进行转义 \在.NET中是转义符 此表达式等同于 \\d{3}
            Match m = regex.Match("this is an apple 123 456 9999");
            Console.WriteLine(m);

            Console.WriteLine("=========Matches方法匹配所有===========");
            MatchCollection matches = regex.Matches("this is an apple 123 456 9999");
            foreach(Match match in matches)
            {
                Console.WriteLine(match);
            }

            Console.WriteLine("=========Matches方法匹配所有===========");
            bool result = regex.IsMatch("this is an apple 123 456 9999");
            Console.WriteLine(result);
        }

        //2.替换操作
        static void Test2()
        {
            //替换所有匹配项
            Regex regex = new Regex("apple");
            string result = regex.Replace("this is an apple,apple,apple", "苹果");
            Console.Write(result);
        }

        //3.使用委托
        static void Test3()
        {
            string result = Regex.Replace("1 2 3 4 5",@"\d+", new MatchEvaluator(
                delegate(Match match) {//匿名方法
                    return "0" + match.Value;
                }
            ),RegexOptions.IgnoreCase|RegexOptions.Singleline);
            //最后一个参数匹配模式 可选
            Console.WriteLine(result);
        }

        //4.$number 使用表达式替换匹配结果中的 number 组  $1表示组1匹配的结果
        static void Test4()
        {
            string result = Regex.Replace("1 2 3 12 13", @"(\d)(\d)", "A$1");
            Console.WriteLine(result);
        }

        //5.${name} 使用表达式替换匹配结果中的 name 组  ${name}表示组名为name匹配的结果 ?<name> 给改组命名为name
        static void Test5() {
            string result = Regex.Replace("1 2 3 12 13", @"(\d)(?<name>\d)", "A${name}");
            Console.WriteLine(result);

        }
        //补充
        //$$ $转义符
        //$& 替换整个匹配
        //$^ 替换匹配前的字符
        //$‘ 替换匹配后的字符
        //$+ 替换最后匹配的组
        //$_ 替换整个字符串
        //(?#这个是注释)  正则内联注释语法 (?#注释)

        //6.1分组
        static void Test6()
        {
            string s = "2005-2-21";
            Regex reg = new Regex(@"(?<y>\d{4})-(?<m>\d{1,2})-(?<d>\d{1,2})", RegexOptions.Compiled);
            Match match = reg.Match(s);

            int year = int.Parse(match.Groups["y"].Value);
            int month = int.Parse(match.Groups["m"].Value);
            int day = int.Parse(match.Groups["d"].Value);

            DateTime time = new DateTime(year, month, day);
            Console.WriteLine(time);
            Console.ReadLine();

            //DateTime.Parse(s);
        }

        //6.2
        static void Test7()
        {
            string s = "2005-2-21";
            Regex reg = new Regex(@"(\d{4})-(\d{1,2})-(\d{1,2})", RegexOptions.Compiled);
            Match match = reg.Match(s);

            int year = int.Parse(match.Groups[1].Value);
            int month = int.Parse(match.Groups[2].Value);
            int day = int.Parse(match.Groups[3].Value);

            DateTime time = new DateTime(year, month, day);
            Console.WriteLine(time);
            Console.ReadLine();
        }

        //6.3
        static void Test8()
        {
            string s = "2005-2-21";
            Regex reg = new Regex(@"(?<2>\d{4})-(?<1>\d{1,2})-(?<3>\d{1,2})", RegexOptions.Compiled);
            Match match = reg.Match(s);

            int year = int.Parse(match.Groups[2].Value);
            int month = int.Parse(match.Groups[1].Value);
            int day = int.Parse(match.Groups[3].Value);

            DateTime time = new DateTime(year, month, day);
            Console.WriteLine(time);
            Console.ReadLine();
        }

    }
}

时间: 2024-08-24 16:17:39

一分钟学会(一):.NET之正则表达式的相关文章

30分钟学会正则表达式

正则表达式30分钟入门教程 版本:v2.33 (2013-1-10) 作者:deerchao 转载请注明来源 原地址:http://www.jb51.net/tools/zhengze.html#mission 目录 跳过目录 本文目标 如何使用本教程 正则表达式到底是什么东西? 入门 测试正则表达式 元字符 字符转义 重复 字符类 分枝条件 反义 分组 后向引用 零宽断言 负向零宽断言 注释 贪婪与懒惰 处理选项 平衡组/递归匹配 还有些什么东西没提到 联系作者 网上的资源及本文参考文献 更新

30分钟带你玩转正则表达式

        30分钟带你玩转正则表达式   定义: 正则表达式说白了就是有普通字符.以及特殊字符组成的文子模式.{匹配模式标准} 正则表达式将会作为一个模板与所搜索的字符串进行匹配.可以让使用者轻易达到搜寻/删除/取代某些特定字符的处理程序.此外vim.grep.find.awk.sed等命令都支持正则表达式 注:在这里希望大家搞明白一件事,那就是通配符和正则表达式的区别与关系: 1.正则表达式是用来匹配字符串的,这个就不解释了2.通配符是用来通配的,也就是shell在做Pathname E

3 分钟学会调用 Apache Spark MLlib KMeans

Apache Spark MLlib是Apache Spark体系中重要的一块拼图:提供了机器学习的模块.不过,目前对此网上介绍的文章不是很多.拿KMeans来说,网上有些文章提供了一些示例程序,而这些程序基本和Apache Spark 官网上的程序片断类似:在得到训练模型后,几乎都没有展示如何使用该模型.程序执行流程.结果展示以及举例测试数据等部分.笔者根据Apache Spark官网上的程序片断,写了一个完整的调用MLlib KMeans库的测试程序,并成功在Spark 1.0 + Yarn

10分钟学会基于ASP.NET的 JQuery实例 (转)

本文介绍如何在ASP.NET(ASP.NET/AJAX)里使用基于JQuery的AJAX技术.(源代码下载见最后) 在使用JQuery前,请到www.jquery.com下载最新版本的js代码,然后再代码里使用 <script src="_scripts/jQuery-1.2.6.js" type="text/javascript"></script>即可,当然,由于微软已经把JQuery集成到VS里,所以你可以到WWW.ASP.NET/aj

十分钟学会Markdown(younghz原创)

younghz原创,转载请注明:http://blog.csdn.net/u012150179/article/details/26503779 原内容及代码托管在GitHub上,并持续更新,欢迎交流:https://github.com/younghz/Markdown 主要内容 MARKDOWN是什么? 谁发明可这么个牛X的东西? 为什么要使用它? 怎么使用? 都谁在用?没人用的东西我可不用. 感觉有意思?趁热打铁,推荐几个工具. 正文 1. MARKDOWN是什么? MARKDOWN是一种

三分钟学会 JavaScript 单元测试

此篇文章使用 js-test-driver , 希望给无任何JavaScript 单元测试经验的开发者, 能在最短的时间内, 开展单元测试的工作? 附件: 三分钟学会 JavaScript 单元测试

两分钟学会Unity3D布娃娃的使用

在RPG游戏中,为了让人物的死亡更加真实,unity创建布娃娃系统,搞的跟真的一样,尼玛我差点就相信那是真的了. 1.首先打开unity,创建地形,导入已经准备好的人物模块. 2.project下选中该模型,再为该模型添加布娃娃属性:GameObject->Create Other->RagDoll 3.在弹出的框中将布娃娃的各个结点设置进去 4.一定要去掉该人物的Box Collider属性,运行程序,就可以看到人物的死亡效果啦. 两分钟学会Unity3D布娃娃的使用,布布扣,bubuko.

【转载】【grunt整合版】30分钟学会使用grunt打包前端代码

[grunt整合版]30分钟学会使用grunt打包前端代码 grunt 是一套前端自动化工具,一个基于nodeJs的命令行工具,一般用于:① 压缩文件② 合并文件③ 简单语法检查 对于其他用法,我还不太清楚,我们这里简单介绍下grunt的压缩.合并文件,初学,有误请包涵 准备阶段 1.nodeJs环境 因为grunt是基于nodeJs的,所以首先各位需要安装nodeJS环境,这块我们便不管了http://www.cnblogs.com/yexiaochai/p/3527418.html 2.安装

PHP学习过程_Symfony_(3)_整理_十分钟学会Symfony

这篇文章主要介绍了Symfony学习十分钟入门教程,详细介绍了Symfony的安装配置,项目初始化,建立Bundle,设计实体,添加约束,增删改查等基本操作技巧,需要的朋友可以参考下 (此文章已被多人复制转载,原文为我们老板写的"十分钟学会Symfony",不过GItHub已经清理了,所以今天我重新整理一下,不过基本不变) Symfony是一个强大的基于PHP的Web开发框架,在这里我们用十分钟的时间来做一个简单的增删改查的程序, 任何不熟悉Symfony的人都可以通过这个教程完成自己

50分钟学会Laravel 50个小技巧

50分钟学会Laravel 50个小技巧 时间 2015-12-09 17:13:45  Yuansir-web菜鸟 原文  http://www.yuansir-web.com/2015/12/09/50分钟学会laravel-50个小技巧/ 主题 Laravel 转载请注明:转载自 Yuansir-web菜鸟 | LAMP学习笔记 本文链接地址: 50分钟学会Laravel 50个小技巧 原文链接:< 50 Laravel Tricks in 50 Minutes by willroth >