设为首页 加入收藏

TOP

C#实现正则表达式入门实战教程(三)
2018-03-28 09:05:54 】 浏览:329
Tags:实现 正则 表达式 入门 实战 教程
,只要把数字截出来,判断 >=0&& <=255就可以了,这里也可能有更简便的做法,笔者一时没想出来,欢迎有好办法的同学留言给我。


  这个题目是我学习正则表达式的起源。当时我在重构代码,发现有一个方法写的多余我们管这个多余的方法叫MA,应该换成MB(另一个方法),MA接受2个变量,MB接受一个变量。VS提供了自动更换函数名字的功能,但是对于函数变量的变化就无能为力了。当时全工程有接近50个MA的调用,都要替换成MB,如果手动一下一下的删除多余的参数,那实在是太恶心了。VS查找界面提供了替换功能,我看到搜索选项里面有正则表达式一项,是否能够使用正则表达式来自动替换?于是就开始研究起正则表达式,是1天还是2天,磕磕绊绊,研究出了表达式,然后一试,确实好使!怕匹配错,就点击替换,一个一个的换,中间多次调整表达式,最终在没有手动更改的情况下,全部替换成功,当时真的很高兴,感觉正则表达式很神奇。因此我就把这个情景转换为第四课的内容,前面讲的都是匹配,这一课就来看看如何进行替换。下面是题目的要求,上面的一组Console.WriteLine是原语句,下面的4个Console.WriteLine是替换后的样子。就是用MB替换MA,并保留MA的第一个参数给MB,舍弃第二个参数。每条语句都毫无意义,只是用来替换。


//下面的语句没有任何的实际意义,只是模拟 想要替换的语句的具体使用。Console.WriteLine(MA("a", "b")),
Console.WriteLine("a" + MA("a", GetType().ToString()));
Console.WriteLine(MA("a", GetType().ToString()));
Console.WriteLine("a" + MA("a", "a".Substring(1)) + "b");


//替换成如下的样子Console.WriteLine(MB("a"));
Console.WriteLine("a" + MB("a"));
Console.WriteLine(MB("a"));
Console.WriteLine("a" + MB("a") + "b");
//这两个方法没有任何意义,只是用MA模拟原函数,MB模拟想要被替换的函数public string MA(string a, string b) { return null; }
public string MB(string a) { return null; }


  先来匹配,分析一下要替换的4条语句:开始的部分都是函数名MA,内容是()内的部分,只要找到适当的‘(’和‘)’,就可以了。但事实是无法确定到底哪个‘)’才是合适的,能看到后的语句后面有一个‘)’,有的是两个,有的是三个。这里括号要精确匹配,不能匹配多了,不然语句就错误了。一个‘)’的情况是带个",其他的至少有2个‘)’,因此我们可以分两种情况,第一种是"),第二种是多个括号的前两个。这里有一个问题,如何只匹配前两个?在正则表达式中,有两种匹配方式,一种是贪心,一种是非贪心。贪心的意思是能匹配几个就匹配几个,比如a+,在匹配aaaaaab的时候,会匹配全部的a字母,结果是aaaaaa。而如果加入a+?,?的本来意思是0个或1个,但是在这里,表示最多匹配1个,结果就是a。还有一个问题就是,正则表达式中,()是有特殊意义的,如果放弃其特殊意义,只是想匹配括号,就要用转义副\,这个用过ASC||码的都应该能明白。则匹配MA函数的表达式为:MA\((.+),\s?.+?(\)\))|""\)  。注意,c#中双引号要这样 @"""",前面用@,然后用两个""表示一个双引号。读别人的正则表达式会有些费劲,那么我的建议是你可以先不看我的结果,只要明白题意,一边查看手册,一边自己练习一点一点的试,很快就能做出来,这时 你就明白大概了,再来看拿自己的表达式与别人的对比,很有可能你做的比我简略!


  可以看到在\s?之后,我用.+?来尽量少的匹配字符,直到遇到))或者")就停止匹配,如果只用.+,就会过多的匹配括号。 光有正则表达式还不够,还要能替换。替换的难点在如何保留第一个变量。正则表达式提供了提取括号里匹配到则值得机制,如(\w)\1(\w)\2,能够匹配aabb,第一个\w匹配到了a,由于在括号中,因此被记录了下来,可通过\1来获得第一个括号中的内容,以此类推。在替换时,C#(其他语言不清楚),可利用$1来获得第一个括号中匹配到的内容。则替换的语句是MB($1)。注意,这里替换的语句不需要转义,因为替换不需要匹配,只要将字符原封不动替换就可以了。下面是代码:


public static void Lesson4(){
    Console.WriteLine("第四课,替换函数。");
    string rule = @"MA\((.+?),\s?.+?(\)\)|""\))";
    string[] enters =
    {
        @"Console.WriteLine(MA(""a"", ""b""))",
        @"Console.WriteLine(""a"" + MA(""a"", GetType().ToString()));",
        @"Console.WriteLine(MA(""a"", GetType().ToString()));",
        @"Console.WriteLine(""a"" + MA(""a"", ""a"".Substring(1)) + ""b"");"
    };
    string replacement = @"MB($1)";
    foreach (var enter in enters)
    {
        C

首页 上一页 1 2 3 4 下一页 尾页 3/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇从JavaScript的事件循环到Promise 下一篇Vuex初步认识

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目