public static void Lesson3(){
Console.WriteLine("题目是判断一个IP是否合法,规则如下:");
Console.WriteLine("格式必须是***.***.***.***");
Console.WriteLine("其中第一组数字必须大于1, 每组数字都要小于等于255");
//复杂版 string rule = @"^(\d{1,3})(?<!^(0{1,3}|2[6-9]\d|25[6-9]|[3-9]\d{2}))(.[01]?\d?\d|2[0-4]\d|25[0-5]){3}$";
string[] enters =
{
"255.255.255.255", //合法 "21.1.1.1", //合法 "256.0.0.0", //非法
"300.2.2.250", //非法 "10.1.1.99", //合法 "00.1.1.009",//非法
"100.1.1.1"//合法 };
foreach (var enter in enters){
Console.WriteLine(Regex.Match(enter, rule).Convert2String(enter));
}
}
这里要吐槽下,如果能转成数字,判断IP是否合法,只要把数字截出来,判断 >=0&& <=255就可以了,这里也可能有更简便的做法,笔者一时没想出来,欢迎有好办法的同学留言给我。
Lesson4 函数替换
这个题目是我学习正则表达式的起源。当时我在重构代码,发现有一个方法写的多余我们管这个多余的方法叫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#中双引号要这样 @"""",前面用@,然后用两个""表示一个双引号。读别人的正则表达式会有些费劲,那么我的建议是你可以先不看我的结果,只要明白题意,一边查看手册,一边自己练习一点一点的试,很快就能做出来,这时 你就明白大概了,再来看拿自己的表达式与别人的对比,很有可能你做的比我简略!