正则表达式简介与常用表达
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,239)"> 验证一个月的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("字符串",239)"> Matches[在字符串中寻找要查找的内容]的时候,直接写表达式,不需要^$ 4)字符串替换:Regex.Replace("字符串","匹配的正则","替换的正则"); 4、练习 I)IsMatch 1)判断是否是合法的邮政编码(6位数字) Regex.IsMatch(s,@"^d{6}$") 2) 判断一个字符串是不是身份证号码,即是否是15或18位数字
分析: 匹配“以15位数字开始”或者“以18位数字结束”(| 的优先级最低,最后执行) 3)判断一个字符串是否是合法的Email地址
4)匹配IP地址,4段用.分割的最多三位数字。 192.168.54.77、333.333.333.333假设都是正确的
5)判断是否是合法的日期格式“2008-08-08”。四位数字-两位数字-两位数字 要求:年份必须是19**或者20**,月份必须在01--12,日必须在01-31 下面的写法是错误的,因为|的优先级最低,如果你将并列的选项用括号括起来,判断完数字后,会进行)、(的或运算,就乱了!
正确的写法!
6)判断是否是合法的url地址,http://www.test.com/a.htm?id=3&name=aaa(问号后面的可有可无)
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";
Console.ReadKey(); 3)从Email中提取出用户名和域名,比如从test@163.com中提取出test和163.com。 string s = "test@163.com";
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+)"); 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)+"); sb.AppendLine(m.Value); Console.WriteLine(sb.ToString()); 7)从网站抓取所有的图片地址,下载到硬盘(网站所在目录用Cassini搭建一个) //默认网站所在的目录 string address = " wc.Encoding = Encoding.Default; //取得网站的字符串信息 string str=wc.DownloadString(address); //通过观察,分析出图片的存储形式 MatchCollection mc = Regex.Matches(str,@"src=""(hotgirls/(d{2}_d{2}.jpg))"""); //得到每一幅图片的物理全路径 string picAddr=Path.Combine(address,m.Groups[1].Value); //下载图片到自己指定的路径(且图片名称与网站上图片的名称一样) wc.DownloadFile(picAddr,Path.Combine(@"E:",m.Groups[2].Value)); 8)抓取所有超链接 //要非某一项的话(<a href=[^>]+>[^<]+</a>),^一定要用[]括起来
III)Replace 1)删除所有连续的a,其实就是将连续的a替换为空字符串。 string s = "你aaa好aa哈哈a你"; s=Regex.Replace(s,@"a+",""); Console.WriteLine(s); 2)我的生日是05/21/2010耶”转换为“我的生日是2010年05月21日耶 string s = "我的生日是05/21/2010耶";
3)hello 'welcome to' beautiful'China' 输出 hello 【welcome to】 beautiful【China】 string s = " hello 'welcome to' beautiful'China' "; //贪婪模式(?一般用来修饰+)
4)http://www.test.com替换为<a href="http://www.test.com">http://www.test.com</a> string s = "http://www.test.com";
5)将文本中连续的空格替换为一个空格. “hello welcome to China.”→”hello welcome to China” string s = "hello welcome to China.";
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); 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); /*要想提取组,还是用正则的exec方法*/ </script> 4、replace //将所有的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'); 自定义js中的trim方法(使用扩展方法) //自定义trim方法 //去掉左端空格 String.prototype.ltrim = function () { return this.replace(/^s+/,''); }; //去掉右端空格 String.prototype.rtrim = function () { return this.replace(/s+$/,239)"> //去掉两端空格(要加全局模式,因为要替换两次) String.prototype.trim = function () { return this.replace(/^s+|s+$/g,239)"> var msg = ' abc ABC DOIT '; alert('============'+msg.trim()+'================='); </script> (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |