今日随笔,继续写一些关于正则表达式的东西。

首先补一点昨天的内容:

昨天少说了一个贪婪模式,什么是贪婪模式,比如像+或者*这样的元字符匹配中,会以最大匹配值匹配,这句话是什么意思呢,例如:

定义一个正则表达式模式:ab+ ,然后又这样一个字符串"csddabbbbbbbbbbbbaaaa" 那么他匹配出来的字符串就是abbbbbbbbbbbb,而不是ab或者abbbb等等。都是匹配的符合的最大的字符串长度。

那什么时候终结贪婪模式呢? 就是在+或者*这样的元字符后面加一个“?”,还拿上面的例子说明 如果定义的正则表达式模式:“ab+?”,那么字符串"csddabbbbbbbbbbbbaaaa"与其匹配的结果就是ab,这样就看出终结贪婪模式的意思了吧,正酣和贪婪模式相反,是匹配的符合的最小的字符串长度。

好了,上一节主要介绍了Regex类的IsMatch方法,其方法主要是判断字符串是否与正则表达式匹配,主要是在一些验证中用到,比如在网页注册中验证输入的邮箱地址啊,生分证号是否正确等等(这里要说一下,正则表达式是不分语言的,不如^、$、[]等这些元字符在c++中java或者js语言中都是这么用的)。

那么,现在老板有这样一个需求,给你一些网页,让你收集这些网页上的所有emai地址,然后记录下来查到数据库中,方便以后给这些邮箱发送我电商网站的促销信息。

怎么办? 去这些网页里面一个一个找到email?然后一个一个的查到数据库?,我勒个去,太恐怖了吧。

但是,如果你懂得正则表达式的匹配,你就会发现,Is so easy。。。

啥都不说,先上一个例子,比如我要收集这样的一个网页中的email:

//------第一个要求,查找一个网页上的所有email地址,并且提取出来
string str = File.ReadAllText("大家留下email交友吧_email_天涯社区.htm"); //string regex = @"\w+@\w+(\.\w+){1,3}";
string regex = @"[a-zA-Z0-9_]+@[a-zA-Z0-9_]+(\.[a-zA-Z0-9_]+){1,3}";//这个就不用我解释了吧,看过上一章的小伙伴们应该都明吧
MatchCollection coll = Regex.Matches(str, regex);
foreach (Match item in coll)
{
Console.WriteLine(item.Value); }

显示结果:

现在让我们来解释一下代码吧,首先用一个string变量str接受要收集网页的所有内容,然后又定义了email的正则表达式模式regex,这里要注意一下,这个模式和上个模式中少了^$,这里为什么不加这两个元字符了呢,其实想想也知道,我只要在网页中找到其中可以匹配的regex就可以了,而不是让整个str字符串与regex。

然后我们调用了Regex类的Matchs方法,这个方法表示 在指定的输入字符串中搜索指定的正则表达式的所有匹配项,返回结果:搜索操作找到的System.Text.RegularExpressions.Match队形的集合,类型是MatchCollection,然后循环这个集合,调用Match的value属性就能得到匹配的email地址。

恩。。。 ,还有一些其他属性和方法小伙伴们可以自己去看一下,很简单的 相信大家一看就能明吧。

是不是感觉很简单,哈,那么,现在老板又有要求了,他说把提取出的每个email做个对比,看看哪域名的email用的最多。

额。。。email的域名是什么? 就是像@gmail.com这样的东东啦。

该怎么做呢,用字符串截取?当然可以,而且也很好实现,但是要是也是用正则表达式的知识呢?

解决这个问题之前,让我们再来了解一正则表达式中“提取组”这个么个东西,什么是提取组,其实就是在正则表达式模式中加入“()”个东西包起来就是一个提取组,例如:

定义一个表达式模式regex = "name=(\w+)age=(\d{0,2})",我们可以看出在名字的地方有了“()”给包了起来,这就是一个组,在年龄的地方又用"()"包了起来,这又是一个组。,那说了这么多,这个组到时是干啥用的呢,

那么我现在有着样一个字符串与其匹配:str ="name=小强age=23":代码如下:

string regex = @"name=(\w+)age=(\d{0,2})";
string str = "name=小强age=23";
Match match = Regex.Match(str, regex); Console.WriteLine("name:{0},age:{1}", match.Groups[].Value, match.Groups[].Value); //输出结果 name:小强,age:23

Match类中有一个Groups属性,它就是一个组的集合,他的索引是从0开始的,但是索引是0的值是匹配regex模式的在字符串的本身,在这里match.Groups[0].Value得值就是"name=小强age=23",在regex模式中,有两个组,一个是(\w+),一个是(\d{0.3}),怎么判断它的顺序呢,哪个是第一组,哪个是第二种,现这种的还很好判断从左到又呗,但是像(a((b)c(d))ef(g))这样的,怎么判断呢,其实很简单,从左到右看“(”第几个出现就是第几组。

这样,我们就可以在匹配完成后的字符串中继续按着自己的意愿分组得到相应的结果(这里我得到的是名字和年龄)。

好了,现在让我们回到老板的第二个需求,那么我只需要在正则表达式模式中给域名的那一本分用"()"包起来,分成一个组,然后遍历的时候给它放到字典中作为key值,其value值设为0,如果下次再出现的时候,我就让他的value加一上1

代码:

//------第二个要求 我希望把提取出的每个email做个对比,看看哪域名的email用的最多
string str = File.ReadAllText("大家留下email交友吧_email_天涯社区.htm");
string regex = @"[a-zA-Z0-9_]+@([a-zA-Z0-9_]+(\.[a-zA-Z0-9_]+){1,3})";
MatchCollection coll = Regex.Matches(str, regex);
Dictionary<string, int> dic = new Dictionary<string, int>();
foreach (Match item in coll)
{
if (!dic.ContainsKey(item.Groups[].ToString().ToLower()))
{
dic.Add(item.Groups[].ToString().ToLower(), );
}
else
{
dic[item.Groups[].ToString().ToLower()]++;
}
}
//遍历字典
foreach (var item in dic)
{
Console.WriteLine("域名:" + item.Key + " 使用的个数:" + item.Value);
}
//---------------end----------------------

输出结果:

然后再和大家分享几个例子:

#region "192.168.10.5[port=21,type=ftp]",这个字符串表示ip地址是192.168.10.5的服务器的21号端口提供ftp服务,其中若果ftp被省略,则默认是http服务,请解析此字符串然后打印出“IP地址是。。。端口是。。。提供的服务是。。。”
string regex = @"^((\d{1,3}\.){3}\d{1,3})\[port=(\d{2,6})(,type=(\w+))?\]$";
while (true)
{
string ipCode = Console.ReadLine();
Match match = Regex.Match(ipCode, regex);
if (match.Success)//这里也是判断是否匹配成功
{
string ip = match.Groups[].Value;
string port = match.Groups[].Value;
string serverType = "http";
if (match.Groups[].Success) serverType = match.Groups[].Value;
//string serverType = string.IsNullOrEmpty(match.Groups[5].Value) ? "http" : match.Groups[5].Value;
Console.WriteLine("IP地址是{0},端口是{1},提供的服务是{2}", ip, port, serverType);
}
else
{
Console.WriteLine("输入的不是正确的ip地址");
}
}
#endregion #region 字符串替换 将aaaaaaabbbbbbbbbccccccccc 变成abc
string str = "aaaaaaabbbbbbbbbccccccccc";
Console.WriteLine(Regex.Replace(str, @"aa|bb|cc", ""));
#endregion

好啦 今天就写到这吧,然后呢还是希望大家能给出各种建议,不对的地方请指出,我会非常感谢的并且虚心改正,如果今天和昨天的那些例子住有的小伙伴不明白的,也请留言具体指出哪个还不太理解,我也会尽力给予解答,最后希望我的随笔可以给大家带来一些收获。 晚安,小伙伴们。

正则表达式—RegEx(RegularExpressio)(二)的更多相关文章

  1. 正则表达式—RegEx(RegularExpressio)(三)

    今日随笔,继续写一点关于正则表达式的 知识.前两天介绍了正则表达式验证匹配,提取等一些基本的知识,今天继续分享下它的另一个强大的应用:替换(replace). 开始之前,还是要补一下昨天的内容. 在我 ...

  2. (转)正则表达式—RegEx(RegularExpressio)(三)

    原文地址:http://www.cnblogs.com/feng-c-x/archive/2013/09/05/3302465.html 今日随笔,继续写一点关于正则表达式的 知识.前两天介绍了正则表 ...

  3. 正则表达式—RegEx(RegularExpressio)(一)

    今日随笔,想和大家分享一下正则表达式的相关知识. 先不说概念性的东西,举一个例子再说. 验证你输入的邮政编码 ,你输入的邮政编码必须是六位的数字. while (true) { Console.Wri ...

  4. C#正则表达式Regex类的用法

    C#正则表达式Regex类的用法 更多2014/2/18 来源:C#学习浏览量:36891 学习标签: 正则表达式 Regex 本文导读:正则表达式的本质是使用一系列特殊字符模式,来表示某一类字符串, ...

  5. C#正则表达式Regex常用匹配

    使用Regex类需要引用命名空间:using System.Text.RegularExpressions; 利用Regex类实现验证 示例1:注释的代码所起的作用是相同的,不过一个是静态方法,一个是 ...

  6. C#正则表达式Regex类

    C#正则表达式Regex类的使用 C#中为正则表达式的使用提供了非常强大的功能,这就是Regex类.这个包包含于System.Text.RegularExpressions命名空间下面,而这个命名空间 ...

  7. (四)boost库之正则表达式regex

    (四)boost库之正则表达式regex 正则表达式可以为我们带来极大的方便,有了它,再也不用为此烦恼 头文件: #include <boost/regex.hpp> 1.完全匹配 std ...

  8. boost 正则表达式 regex

    boost 正则表达式 regex   环境安装 如果在引用boost regex出现连接错误,但是引用其他的库却没有这个错误,这是因为对于boost来说,是免编译的,但是,正则这个库 是需要单独编译 ...

  9. 请写出正则表达式(regex),取得下列黄色部分的字符串 TEL: 02-236-9655/9659 FAX:02-236-9654 (黄色部分即02-236-9655/9659 ) ( 测试面试题)

    请写出正则表达式(regex),取得下列黄色部分的字符串 TEL: 02-236-9655/9659 FAX:02-236-9654 答: package test1; import java.uti ...

随机推荐

  1. Unity3d修炼之路:GUIbutton简单使用,完毕对一个简单对象Cube的移动,旋转

    #pragma strict private var m_pCubeObj : GameObject = null; private var m_pMeshFilter : MeshFilter = ...

  2. Ajax-jQuery_Ajax_实例 ($.ajax、$.post、$.get)

    Jquery在异步提交方面封装的很好,直接用AJAX非常麻烦,Jquery大大简化了我们的操作,不用考虑浏览器的诧异了. 推荐一篇不错的jQuery Ajax 实例文章,忘记了可以去看看, 地址为:h ...

  3. 【安装Python环境】之安装Selenium2时报UnicodeDecodeError: 'utf-8' codec can't decode byte 0xc8 in position 12: invalid continuation byte问题

    问题描述: windows8.1系统,Python3环境安装Selenium2时报错,错误如下: ..... ..... File "F:\软件\python3.6.1\lib\site-p ...

  4. Javascript 你不知道的事,好吧,是我不知道的事

    NaN表示一个不能产生正常结果的运算结果.它不等于任何值,包括它自己.可以用isNaN(number)来检测. 同Java中的字符串一样,JS中的字符串是不可变的.也就是说一旦字符串被创建,就无法改变 ...

  5. 20个优秀的JavaScript 键盘事件处理库

    键盘事件是 Web 开发中最常用的事件之一,通过对键盘事件的捕获和处理可以提高网站的易用性和交互体验.下面,我们向大家介绍收集的20款优秀的 JavaScript 键盘事件处理库,帮助开发人员轻松处理 ...

  6. 比較JS合并数组的各种方法及其优劣

    原文链接:  Combining JS Arrays原文日期: 2014-09-09翻译日期: 2014-09-18翻译人员: 铁锚 本文属于JavaScript的基础技能. 我们将学习结合/合并两个 ...

  7. 自定义HttpModule,用于未登录用户,不弹出Windows认证窗口,而是跳转回SSO站点

    2012年的一篇随笔记录,可以学习到如何自定义HttpModule,而具体里面针对需求开发的代码,可能未必能让大伙了解到什么,可快速扫描而过. using System; using System.W ...

  8. AI逻辑实现-取舍行为树还是状态机

    AI逻辑实现-选择行为树还是状态机? 关注AI的朋友可能会看过赖勇浩翻译的<有限状态机时代终结的10大理由> ,里面谈到了状态机的诸多弊端.同时在ppt(附上下载地址)中述说了行为树的诸多 ...

  9. mysqldump如何针对某些数据库进行备份?针对某个数据库进行备份?

    需求描述: 通过mysqldump工具对mysql服务器中的某几个数据库进行备份. 或者就对其中的一个数据库进行备份. 操作过程: 1.通过--databases参数后面加上数据库的名字进行备份 [m ...

  10. C#设计模式系列:抽象工厂模式(AbstractFactory)

    出自:http://www.cnblogs.com/libingql/archive/2012/12/09/2809754.html 1. 抽象工厂模式简介 1.1 定义 抽象工厂(Abstract ...