黑马程序员--正则表达式

---------------------- ASP.Net+Android+IO开发S.Net培训、期待与您交流! ----------------------

http://www.cnblogs.com/Alpha-Fly/archive/2012/04/11/2441806.html

 

http://www.cnblogs.com/wuhuisheng/archive/2011/03/22/1991543.html

 

正则表达式

C#中的正则表达式

 
1、正则表达式是用来进行文本处理的技术,是与语言无关的
 
一个正则表达式就是由普通字符以及特殊字符(称为元字符)组成的文字模式 
 
2、元字符
 
整数或者小数:^[0-9]+\.{0,1}[0-9]{0,2}$
 
只能输入数字:"^[0-9]*$"。
 
只能输入n位的数字:"^\d{n}$"。
 
只能输入至少n位的数字:"^\d{n,}$"。
 
只能输入m~n位的数字:。"^\d{m,n}$"
 
只能输入零和非零开头的数字:"^(0|[1-9][0-9]*)$"。
 
只能输入有两位小数的正实数:"^[0-9]+(.[0-9]{2})?$"。
 
只能输入有1~3位小数的正实数:"^[0-9]+(.[0-9]{1,3})?$"。
 
只能输入非零的正整数:"^\+?[1-9][0-9]*$"。
 
只能输入非零的负整数:"^\-[1-9][]0-9"*$。
 
只能输入长度为3的字符:"^.{3}$"。
 
只能输入由26个英文字母组成的字符串:"^[A-Za-z]+$"。
 
只能输入由26个大写英文字母组成的字符串:"^[A-Z]+$"。
 
只能输入由26个小写英文字母组成的字符串:"^[a-z]+$"。
 
只能输入由数字和26个英文字母组成的字符串:"^[A-Za-z0-9]+$"。
 
只能输入由数字、26个英文字母或者下划线组成的字符串:"^\w+$"。
 
验证用户密码:"^[a-zA-Z]\w{5,17}$"正确格式为:以字母开头,长度在6~18之间,只能包含字符、数字和下划线。
 
验证是否含有^%&'',;=?$\"等字符:"[^%&'',;=?$\x22]+"。
 
只能输入汉字:"^[\u4e00-\u9fa5]{0,}$"
 
验证Email地址:"^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$"。
 
验证InternetURL:"^http://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?$"。
 
验证电话号码:"^(\(\d{3,4}-)|\d{3.4}-)?\d{7,8}$"正确格式为:"XXX-XXXXXXX"、"XXXX- XXXXXXXX"、"XXX-XXXXXXX"、"XXX-XXXXXXXX"、"XXXXXXX"和"XXXXXXXX"。
 
验证身份证号(15位或18位数字):"^\d{15}|\d{18}$"。
 
验证一年的12个月:"^(0?[1-9]|1[0-2])$"正确格式为:"01"~"09"和"1"~"12"。
 
验证一个月的31天:"^((0?[1-9])|((1|2)[0-9])|30|31)$"正确格式为;"01"~"09"和"1"~"31"。整数或者小数:^[0-9]+\.{0,1}[0-9]{0,2}$
 
只能输入数字:"^[0-9]*$"。
 
只能输入n位的数字:"^\d{n}$"。
 
只能输入至少n位的数字:"^\d{n,}$"。
 
只能输入m~n位的数字:。"^\d{m,n}$"
 
只能输入零和非零开头的数字:"^(0|[1-9][0-9]*)$"。
 
只能输入有两位小数的正实数:"^[0-9]+(.[0-9]{2})?$"。
 
只能输入有1~3位小数的正实数:"^[0-9]+(.[0-9]{1,3})?$"。
 
只能输入非零的正整数:"^\+?[1-9][0-9]*$"。
 
只能输入非零的负整数:"^\-[1-9][]0-9"*$。
 
只能输入长度为3的字符:"^.{3}$"。
 
只能输入由26个英文字母组成的字符串:"^[A-Za-z]+$"。
 
只能输入由26个大写英文字母组成的字符串:"^[A-Z]+$"。
 
只能输入由26个小写英文字母组成的字符串:"^[a-z]+$"。
 
只能输入由数字和26个英文字母组成的字符串:"^[A-Za-z0-9]+$"。
 
只能输入由数字、26个英文字母或者下划线组成的字符串:"^\w+$"。
 
验证用户密码:"^[a-zA-Z]\w{5,17}$"正确格式为:以字母开头,长度在6~18之间,只能包含字符、数字和下划线。
 
验证是否含有^%&'',;=?$\"等字符:"[^%&'',;=?$\x22]+"。
 
只能输入汉字:"^[\u4e00-\u9fa5]{0,}$"
 
验证Email地址:"^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$"。
 
验证InternetURL:"^http://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?$"。
 
验证电话号码:"^(\(\d{3,4}-)|\d{3.4}-)?\d{7,8}$"正确格式为:"XXX-XXXXXXX"、"XXXX- XXXXXXXX"、"XXX-XXXXXXX"、"XXX-XXXXXXXX"、"XXXXXXX"和"XXXXXXXX"。
 
验证身份证号(15位或18位数字):"^\d{15}|\d{18}$"。
 
验证一年的12个月:"^(0?[1-9]|1[0-2])$"正确格式为:"01"~"09"和"1"~"12"。
 
验证一个月的31天:"^((0?[1-9])|((1|2)[0-9])|30|31)$"正确格式为;"01"~"09"和"1"~"31"。
 
 
 
3、Regex静态类常用的4种情况
 
1)        判断是否匹配:Regex.IsMatch("字符串","正则表达式");
 
   IsMatch的正则表达式,一般要加^$,因为它是精确判断是否匹配。
 
2)        字符串提取:Regex.Match("字符串","正则表达式"); 只能提取一次,一般也加^$
 
3)        字符串提取(循环提取所有匹配的):Regex.Matches("字符串","正则表达式");
 
   Matches[在字符串中寻找要查找的内容]的时候,直接写表达式,不需要^$
 
4)        字符串替换:Regex.Replace("字符串","匹配的正则","替换的正则");
 
 
 
4、练习
 
I)        IsMatch
 
1)        判断是否是合法的邮政编码(6位数字)
 
Regex.IsMatch(s, @"^\d{6}$")
 
 
 
2)         判断一个字符串是不是身份证号码,即是否是15或18位数字
 
Regex.IsMatch(s, @"^\d{15}|\d{18}$")
 
分析: 匹配“以15位数字开始”或者“以18位数字结束”( | 的优先级最低,最后执行)                       
 
 
 
3)        判断一个字符串是否是合法的Email地址
 
Regex.IsMatch(s, @"^\w+@\w+(\.\w+)+$")
 
 
 
4)        匹配IP地址,4段用.分割的最多三位数字。 192.168.54.77、333.333.333.333假设都是正确的
 
Regex.IsMatch(s, @"^\d{1,3}(\.\d{1,3}){3}$")
 
 
 
5)        判断是否是合法的日期格式“2008-08-08”。四位数字-两位数字-两位数字
 
  要求:年份必须是19**或者20**,月份必须在01--12,日必须在01-31
 
下面的写法是错误的,因为|的优先级最低,如果你将并列的选项用括号括起来,判断完数字后,会进行)、(的或运算,就乱了!
 
Regex.IsMatch(s, @"^(19|20)\d{2}-(0[1-9])|(1[0-2])-(0[1-9])|([12]\d)|(3[01])$")
 
正确的写法!
 
Regex.IsMatch(s, @"^(19|20)\d{2}-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01])$")
 
 
 
6)        判断是否是合法的url地址,http://www.test.com/a.htm?id=3&name=aaa(问号后面的可有可无)
 
Regex.IsMatch(s, @"^\w+://\w+(\.\w+)+(\?\w+=\w+(&\w+=\w+)*)?$")
 
 
 
II)        Match & Matches
 
1)        从文件路径中提取出文件名(包含后缀)
 
string s = "C:/funny/make/1.txt";
 
Match m=Regex.Match(s, @".+/(.+)");
 
if (m.Success)
 
{
 
Console.WriteLine(m.Groups[1].Value);
 
}
 
 
 
2)        从“June       26   ,       1951”中提取出月份June来
 
string s = "June       26   ,       1951";
 
Match m=Regex.Match(s, @"(\w+)\s+\d+.+\d+");
 
if (m.Success)
 
{
 
Console.WriteLine(m.Groups[1].Value);
 
}
 
Console.ReadKey();
 
 
 
3)        从Email中提取出用户名和域名,比如从test@163.com中提取出test和163.com。
 
string s = "test@163.com";
 
Match m=Regex.Match(s, @"^(.+)@(.+)$");
 
string name = m.Groups[1].Value;
 
string field = m.Groups[2].Value;
 
Console.WriteLine("用户名是{0},域名是{1}",name,field);       
 
 
 
4)        从一段文本中提取所有的数字
 
string s = "大家好,我是Hebe,我22岁了,身高180,我们团队有3个女女!";
 
MatchCollection mc= Regex.Matches(s, @"\d+");
 
foreach (Match m in mc)
 
{
 
Console.WriteLine(m.Value);
 
}
 
   Console.ReadKey();
 
 
 
5)        从字符串中提取所有人名
 
string s = "大家好。我们是牛人。我是Jason。我是Jay。呜呜。fffff";
 
MatchCollection mc = Regex.Matches(s, @"我是(\w+)");
 
foreach (Match m in mc)
 
{
 
Console.WriteLine(m.Groups[1].Value);
 
}
 
Console.ReadKey();
 
 
6)        从一个网站页面提取所有Email地址
 
StringBuilder sb = new StringBuilder();
 
//有问题的话把8080端口号加上,那个default网站的地址
 
string path = "http://localhost:8080/";
 
//创建WebClient
 
WebClient wc = new WebClient();
 
//注意编码问题(!!!)
 
wc.Encoding = Encoding.UTF8;
 
//从网站下载字符串
 
string content=wc.DownloadString(path);
 
//要会写正则
 
MatchCollection mc = Regex.Matches(content, @"\w+@\w+(\.\w)+");
 
foreach (Match m in mc)
 
{
 
if (m.Success)
 
{
 
sb.AppendLine(m.Value);
 
}
 
}
 
Console.WriteLine(sb.ToString());
 
Console.ReadKey();
 
 
 
7)        从网站抓取所有的图片地址,下载到硬盘(网站所在目录用Cassini搭建一个)
 
//默认网站所在的目录
 
string address = "http://localhost:8080/";
 
WebClient wc = new WebClient();
 
wc.Encoding = Encoding.Default;
 
//取得网站的字符串信息
 
string str=wc.DownloadString(address);
 
//通过观察,分析出图片的存储形式
 
MatchCollection mc = Regex.Matches(str, @"src=""(hotgirls/(\d{2}_\d{2}\.jpg))""");
 
foreach (Match m in mc)
 
{
 
//得到每一幅图片的物理全路径
 
string picAddr=Path.Combine(address,m.Groups[1].Value);
 
//下载图片到自己指定的路径(且图片名称与网站上图片的名称一样)
 
wc.DownloadFile(picAddr, Path.Combine(@"E:",m.Groups[2].Value));
 
}
 
 
 
8)        抓取所有超链接       
 
StringBuilder sb = new StringBuilder();
 
//默认网站所在的目录
 
string address = "http://localhost:8080/";
 
WebClient wc = new WebClient();
 
wc.Encoding = Encoding.UTF8;
 
//取得网站的字符串信息
 
string str=wc.DownloadString(address);
 
//通过观察,分析出图片的存储形式
 
//要非某一项的话(<a href=[^>]+>[^<]+</a>),^一定要用[]括起来
 
MatchCollection mc = Regex.Matches(str, @"<a href=[^>]+>[^<]+</a>");
 
foreach (Match m in mc)
 
{
 
sb.AppendLine(m.Value);
 
}
 
Console.WriteLine(sb.ToString());
 
Console.ReadKey();
 
 
 
III)        Replace
 
1)        删除所有连续的a,其实就是将连续的a替换为空字符串。
 
string s = "你aaa好aa哈哈a你";
 
s=Regex.Replace(s, @"a+", "");
 
Console.WriteLine(s);
 
Console.ReadKey();
 
 
 
2)        我的生日是05/21/2010耶”转换为“我的生日是2010年05月21日耶
 
string s = "我的生日是05/21/2010耶";
 
s=Regex.Replace(s, @"(\d{2})/(\d{2})/(\d{4})", "$3年$1月$2日");
 
Console.WriteLine(s);
 
Console.ReadKey();
 
 
 
3)        hello 'welcome to'  beautiful'China' 输出  hello 【welcome to】  beautiful【China】
 
string s = " hello 'welcome to'  beautiful'China'  ";
 
//贪婪模式(?一般用来修饰+)
 
s=Regex.Replace(s, @"'(.+?)'", "【$1】");
 
Console.WriteLine(s);
 
Console.ReadKey();
 
 
 
4)        http://www.test.com   替换为   <a href="http://www.test.com">http://www.test.com</a>
 
string s = "http://www.test.com";
 
s=Regex.Replace(s, @"(.+)", @"<a href=""$1"">$1</a>");
 
Console.WriteLine(s);
 
Console.ReadKey();
 
 
 
5)        将文本中连续的空格替换为一个空格.
 
“hello         welcome    to China.”→”hello welcome to China”
 
string s = "hello         welcome    to China.";
 
s=Regex.Replace(s, @"(\s)+", @"$1");
 
Console.WriteLine(s);
 
Console.ReadKey();
 
 
 
6)        UBB翻译
 
将[URL=http://www.baidu.com]百度网[/URL]替换为<a                         href="http://www.baidu.com">百度网</a>
 
string s = "[URL=http://www.baidu.com]百度网[/URL]";
 
string str = Regex.Replace(s, @".+=(.+)\](.+)\[.+", @"<a href=""$1"">$2</a>");
 
Console.WriteLine(str);
 
Console.ReadKey();
 
 
 
JavaScript中的正则表达式
 
 
 
1、test (不要用g)
 
判断是否匹配用test方法[正则表达式.test(字符串)],相当于C#中的isMatch()
 
 
 
2、exec
 
<html xmlns="http://www.w3.org/1999/xhtml">
 
<head>
 
    <script type="text/javascript">
 
        var msg = '中国移动:10086;中国联通:10010;中国电信:10000;传智博客:51552111';
 
        /*
 
        var reg = /\d+(\d{2})/;
 
        //exec的用法(默认情况下exec相当于C#中的Match方法,只能提取字符串中第一个匹配的信息,但是依然会返回一个数组,因为第一个匹配项可能存在‘提取’组的信息!)
 
        var result = reg.exec(msg);
 
        alert(result);  //输出[10086,86]这个数组
 
        用此正则表达式,如果再调用result = reg.exec(msg);输出的result依旧是[10086,86]
 
        */
 
 
 
        var reg = /\d+(\d{2})/g;
 
        //exec的用法(用循环遍历的方法,得到所有的情况!是因为正则表达式加了一个g!)
 
        //但用注意的是:exec每次只能返回一个匹配值及这个值中的分组值,并赋值给r(匹配完之后,它匹配的指针相当于由匹配项向后移动了一位,由while循环寻找下一个匹配项!),并不是一次性将所有匹配的结果添加到一个数组中的!
 
        var r='';
 
        while ((r=reg.exec(msg)) != null) {
 
            alert(r);
 
        }
 
 
 
    </script>
 
</head>
 
<body>
 
</body>
 
</html>
 
 
 
3、match
 
<script type="text/javascript">
 
        var msg = '爱你13888888888你爱我吗13788888888正的爱我吗13688888888';
 
        var result = msg.match(/\d{11}/);  //只提取第一个,相当于C#中的Match
 
        alert(result);
 
 
 
        //当通过字符串的match方法,加g(全局模式)提取时,
 
        //这个返回值是一个数组,相当于C#中的Matches
 
        var result = msg.match(/\d{11}/g);
 
        alert(result);
 
 
 
        /*要想提取组,还是用正则的exec方法*/
 
</script>
 
 
 
4、replace
 
<script type="text/javascript">
 
        var msg = '爱你13888888888你爱我吗13788888888正的爱我吗13688888888';
 
        //将所有的8替换成6,如果不加g的话,只替换第一次出现的8
 
        //result = msg.replace(/8/g,'6');
 
        //alert(result);
 
        //保留所有号码的前3位和后4位,其他的用*代替
 
        result = msg.replace(/(\d{3})\d{4}(\d{4})/g, '$1****$2');
 
        alert(result);
 
</script>
 
 
 
自定义js中的trim方法(使用扩展方法)
 
  <script type="text/javascript">
 
        //自定义trim方法
 
        //去掉左端空格
 
        String.prototype.ltrim = function () {
 
            return this.replace(/^\s+/,'');
 
        };
 
 
 
        //去掉右端空格
 
        String.prototype.rtrim = function () {
 
            return this.replace(/\s+$/,'');
 
        };
 

        //去掉两端空格(要加全局模式,因为要替换两次)
 
        String.prototype.trim = function () {
 
            return this.replace(/^\s+|\s+$/g,'');
 
        };
 
        var msg = '     abc  ABC  DOIT         ';
 
        alert('============'+msg.trim()+'=================');
 
 </script>        

 ----------------------ASP.Net+Android+IOS开发.Net培训、期待与您交流! ----------------------

详细请查看:<ahref="http://edu.csdn.net" target="blank">http://edu.csdn.net</a>

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值