正则表达式—RegEx(RegularExpressio)(三)
今日随笔,继续写一点关于正则表达式的 知识。前两天介绍了正则表达式验证匹配,提取等一些基本的知识,今天继续分享下它的另一个强大的应用:替换(replace)。
开始之前,还是要补一下昨天的内容。
在我们昨天的内容里,有一个提取组的概念,在上一节中,我么只用了数值索引来获取某组的value。我们还可以给某个组取一个别名,然后通过别名来找到相应的组的value。
我们还拿昨天的name和age那个例子说明:
1 //----------------------------------通过数值索引-------------------
2 string regex = @"name=(\w+)age=(\d{0,2})";
3 string str = "name=小强age=23";
4 Match match = Regex.Match(str, regex);
5
6 Console.WriteLine("name:{0},age:{1}", match.Groups[1].Value, match.Groups[2].Value);
7
8 //输出结果 name:小强,age:23
9 //----------------------------------end-------------------
10 11 //-------------------------------------通过别名------------------------------
12 string regex = @"name=(?<name>\w+)age=(?'age'\d{0,2})";
13 string str = "name=小强age=23";
14 Match match = Regex.Match(str, regex);
15
16 Console.WriteLine("name:{0},age:{1}", match.Groups["name"].Value, match.Groups["age"].Value);
17 Console.WriteLine("COUNT:" + match.Groups.Count);
18 for (int i = 0; i < match.Groups.Count; i++)
19 {
20 Console.WriteLine("{0}--------->{1}", i, match.Groups[i].Value);
21 }
22
23 //输出结果 name:小强,age:23
24 //COUNT:3
25 //0---------->name=小强age=23
26 //1---------->小强
27 //2---------->23
首先,要先说一下这是微软支持组别名的语法,在PHP,Python中,可以用(?P﹤name﹥group)来对组进行命名。词法?P﹤name﹥就是对组(group)进行了命名。其中name是你对组的起的名字。你可以用(?P=name)进行引用(一会会介绍引用这个东东)。
NET framework也支持命名组。不幸的是,微软的程序员们决定发明他们自己的语法,而不是沿用Perl、Python的规则。
(?﹤name﹥小强)(?’age’ 23),
如你所看到的,.NET提供两种词法来创建命名组:一是用尖括号“?﹤﹥”,或者用单引号“?'' ”。尖括号在字符串中使用更方便,单引号在ASP代码中更有用,因为ASP代码中“﹤﹥”被用作HTML标签。
恩。。。,今天还要补一组别名的另一个应用:“正则表达式组之重复操作与后向引用”
当用“()”定义了一个正则表达式组后,正则引擎则会把被匹配的组按照顺序编号,存入缓存。当对被匹配的组进行向后引用的时候,可以用“\数字”的方式进行引用。“\1”引用第一个匹配的后向引用组,“\2"引用第二个组,以此类推,"\n"引用第n个组。而"\0"则引用整个被匹配的正则表达式本身。我们看一个例子。
假设你想匹配一个HTML标签的开始标签和结束标签,以及标签中间的文本。比如﹤B﹥This is a test﹤/B﹥,我们要匹配﹤B﹥和﹤/B﹥以及中间的文字。我们可以用如下正则表达式:“﹤([A-Z][A-Z0-9]*)[^﹥]*﹥.*?﹤/\1﹥”
首先,“﹤”将会匹配“﹤B﹥”的第一个字符“﹤”。然后[A-Z]匹配B,[A-Z0-9]*将会匹配0到多次字母数字,后面紧接着0到多个非“﹥”的字符。最后正则表达式的“﹥”将会匹配“﹤B﹥”的“﹥”。接下来正则引擎将对结束标签之前的字符进行惰性匹配,直到遇到一个“﹤/”符号。然后正则表达式中的“\1”表示对前面匹配的组“([A-Z][A-Z0-9]*)”进行引用,在本例中,被引用的是标签名“B”。所以需要被匹配的结尾标签为“﹤/B﹥”
你可以对相同的后向引用组进行多次引用,([a-c])x\1x\1将匹配“axaxa”、“bxbxb”以及“cxcxc”。如果用数字形式引用的组没有有效的匹配,则引用到的内容简单的为空。
一个后向引用不能用于它自身。([abc]\1)是错误的。因此你不能将﹤﹤\0﹥﹥用于一个正则表达式匹配本身,它只能用于替换操作中。
代码如下:
string regex = @"name=(\w+),waihao=\1";
//string regex = @"([a-c])x\1x\1";
while (true)
{
string str = Console.ReadLine();
Console.WriteLine(Regex.IsMatch(str, regex));
} //输入:name=小强,waihao=小强
//输出的是True
好啦,昨天的内容,就补到这,现在让我们看看正则表达式中替换的用法。
啥也不说,还是先上例子
#region 正则表达式字符串替换,将连续的a都替换成a ////1.你aaa好aa哈哈a你 //string msg = "你aaa好aa哈aaaaa哈a你";
//msg = Regex.Replace(msg, "a+", "a");
//Console.WriteLine(msg);
//Console.ReadKey();
#endregion #region 练习2:将连续的-都替换成一个- //string msg = "234-----234--------------34------55";
//msg = Regex.Replace(msg, @"\-+", "-");
////Regex.Split();
//Console.WriteLine(msg);
//Console.ReadKey(); #endregion #region 替换案例:将hello 'welcome' to 'China' 替换成 hello 【welcome】 to 【China】
////hello 【welcome】 to 【China】
////'slslls' 【slslls】
//string msg = "hello 'welcome' to 'China'";
////msg.Replace("'","】"
//正则表达式的替换中也可以使用提取组,使用()来分组,使用$n,来引用提取组。
//msg = Regex.Replace(msg, "'(.+?)'", "【$1】");
//Console.WriteLine(msg);
//Console.ReadKey(); #endregion
替换:顾名思义就是把一个字符串中,与正则表达式模式匹配的地方,给替换成我们想要的部分。用的是Regex的Replace方法。。。
Replace: 在指定的输入字符串内,使用指定的替换字符串替换与指定正则表达式匹配的所有字符串。返回结果:一个与输入字符串基本相同的新字符串,唯一的差别在于,其中的每个匹配字符串已被替换字符串代替。
在上面的三个例子中,前两个很简单了,我就不说了,有一点要注意的是”-“是元字符,所以要转义一下。
第三个例子我要说一下,这里要注意两点,一点事提取组的用法:例子中要把说有用引号包起来的地方都替换成 用【】包起来,那么我们先定义一个正则表达式模式regex='(.+?)',这里我们把引号之间的内容括了起来作为一个提取住,然后在replac方法的第三个参数中,我们可以用$1代替刚才那个提取组的内容(因为引号之间的内容是第一组,所以这里用的是$1)。同时,还要注意一点的就是在”.+“的后面加了一个问号,这就是我们前面所说的终止贪婪模式,如果不加得话,以为welcome' to 'China 都属于"."这个元字符的匹配的范围内,所以最终匹配的结果将会是hello 【welcome' to 'China】。
Repalce方法有一个重载,第三个参数是穿进去一个委托实例(方法),在这个方法中,你可以自己定义具体要怎么替换或者是做相应的操作,然后将string结果返回。这个就先不举例子了,在今后我会专门写一个委托的系列和大家分享。
好啦,再给大家上几个例子,正则表达式就告于段落了,这三篇文章知识讲了一些正则表达式的基本用法,和一些应用的列子(在这些应用中,有的正则表达式模式定义的不是很精确,比如上一节中匹配email,上上节中的匹配身份证等等,在这里主要的目的是举例子介绍正则表达式,而没有去写较精确的匹配模式),它还有更多的应用和用法,大家在工作中继续探讨和学习吧。
#region 手机号码隐去中间四位
//string msg = "我叫杨中科:13488888888我是苏坤18999141365。蒋坤:13111111111。";
//msg = Regex.Replace(msg, @"(\d{3})\d{4}(\d{4})", "$1****$2");
//Console.WriteLine(msg);
//Console.ReadKey();
#endregion #region 练习1:将一段文本中的MM/DD/YYYY格式的日期转换为YYYY-MM-DD格式 ,比如“我的生日是05/21/2010耶”转换为“我的生日是2010-05-21耶”。 //string msg = "我的生日是05/21/2010耶,TA的生日是:06/09/2000,哦耶耶"; //msg = Regex.Replace(msg, @"(\d{2})/(\d{2})/(\d{4})", "$3-$1-$2");
//Console.WriteLine(msg);
//Console.ReadKey(); #endregion //a+?
//xaaaaaaaab #region 练习2:给一段文本中匹配到的url添加超链接,比如把http://www.test.com替换为<a href="http://www.test.com"> http://www.test.com</a>。 //string msg = "比如把http://www.test.com,新浪http://www.sina.com百度http://www.baidu.com网易:http://www.163.com。传智播客http://net.itcast.cn。"; //msg = Regex.Replace(msg, @"(http://[a-zA-Z0-9_\-\.&\?]+)", "<a href=\"$1\">$1</a>");
//Console.WriteLine(msg);
//Console.ReadKey();
#endregion
恩。。给自己的博客做个广告吧,这段时间正在写一个关于asp.net运行机制的系列,希望更多的小伙伴们可以去给 出指点。
好啦,亲爱的小伙伴们,我们一起加油吧,坚信我的老师跟我说的一句话,写程序也是一种艺术,程序员是一名艺术家,而不是苦逼。 ^_^ Come On~~ GO!GO!.
正则表达式—RegEx(RegularExpressio)(三)的更多相关文章
- (转)正则表达式—RegEx(RegularExpressio)(三)
原文地址:http://www.cnblogs.com/feng-c-x/archive/2013/09/05/3302465.html 今日随笔,继续写一点关于正则表达式的 知识.前两天介绍了正则表 ...
- 正则表达式—RegEx(RegularExpressio)(一)
今日随笔,想和大家分享一下正则表达式的相关知识. 先不说概念性的东西,举一个例子再说. 验证你输入的邮政编码 ,你输入的邮政编码必须是六位的数字. while (true) { Console.Wri ...
- 正则表达式—RegEx(RegularExpressio)(二)
今日随笔,继续写一些关于正则表达式的东西. 首先补一点昨天的内容: 昨天少说了一个贪婪模式,什么是贪婪模式,比如像+或者*这样的元字符匹配中,会以最大匹配值匹配,这句话是什么意思呢,例如: 定义一个正 ...
- C#正则表达式Regex类的用法
C#正则表达式Regex类的用法 更多2014/2/18 来源:C#学习浏览量:36891 学习标签: 正则表达式 Regex 本文导读:正则表达式的本质是使用一系列特殊字符模式,来表示某一类字符串, ...
- C#正则表达式Regex类
C#正则表达式Regex类的使用 C#中为正则表达式的使用提供了非常强大的功能,这就是Regex类.这个包包含于System.Text.RegularExpressions命名空间下面,而这个命名空间 ...
- C#正则表达式Regex常用匹配
使用Regex类需要引用命名空间:using System.Text.RegularExpressions; 利用Regex类实现验证 示例1:注释的代码所起的作用是相同的,不过一个是静态方法,一个是 ...
- (四)boost库之正则表达式regex
(四)boost库之正则表达式regex 正则表达式可以为我们带来极大的方便,有了它,再也不用为此烦恼 头文件: #include <boost/regex.hpp> 1.完全匹配 std ...
- boost 正则表达式 regex
boost 正则表达式 regex 环境安装 如果在引用boost regex出现连接错误,但是引用其他的库却没有这个错误,这是因为对于boost来说,是免编译的,但是,正则这个库 是需要单独编译 ...
- 请写出正则表达式(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 ...
随机推荐
- Web API(五):Web API跨域问题
一.什么是跨域问题 跨域:指的是浏览器不能执行其他网站的脚本.是由浏览器的同源策略造成的,是浏览器施加的安全限制.(服务端可以正常接收浏览器发生的请求,也可以正常返回,但是由于浏览器的安全策略,浏览器 ...
- python中copy 与 '=' 的区别
当你a=1000的时候a指向一个新的类,内容为1000,而b仍然指向原来指向的内容,因为你没有叫它指向其他内容.你使用=符号,使得a和b指向同一个内容,而copy则是将b的内容复制后让c指向这个拷贝的 ...
- [oracle] oracle-ibatis-整理
① <!-- 复用sql代码 --> <sql id="CUSTOM_CABINET_INFO.QUERY_CABINET"> <dynamic pr ...
- 重要:C/C++变量的自动初始化
对于内置变量的自动初始化 代码1: #include<stdio.h> #define CONST 100 int *p1; ]; int b; static int c; main() ...
- 一个极其高效的虚拟机内存冗余消除机制:UKSM
Linux内核机制KSM(Kernel Samepage Merging)能合并KVM虚拟机之间相同内存的页面,被CentOS, RHEL之类的服务器内核广泛采用,但是其速度很慢.UKSM(Ultra ...
- Java String 学习
String, 首先,String有字面值常量的概念,这个字面值常量是在编译期确定下来的,类加载时直接存入常量池(注意,常量池是类的常量池,类与类之间隔离). 而运行时生成的字符串,是不在常量池中的. ...
- matplotlib中的legend()——用于显示图例
legend()的一个用法: 当我们有多个 axes时,我们如何把它们的图例放在一起呢?? 我们可以这么做: import matplotlib.pyplot as plt import numpy ...
- bt开源的客户端——xbt client
我部署好了bt tracker, 用bitcomet可以下载. 但xbt client下载不来.torrent资源.
- 使用avahi 的mdns服务发现server
avahi-browse -a 可以查看局域网内所有的mdns服务, avahi-browse -r _xxxxx._tcp
- 图像的降采样与升采样(二维插值)----转自LOFTER-gengjiwen
图像的降采样与升采样(二维插值) 1.先说说这两个词的概念: 降采样,即是采样点数减少.对于一幅N*M的图像来说,如果降采样系数为k,则即是在原图中 每行每列每隔k个点取一个点组成一幅图像.降采样很容 ...