你的位置:首页 > ASP.net教程

[ASP.net教程].Net程序员应该掌握的正则表达式


Regular Expression

Net程序员必然要掌握正则的核心内容:匹配提取替换常用元字符

正则表达式是用来进行文本处理的技术,是语言无关的,在几乎所有语言中都有实现。

 


 

常用元字符

.:代表除了换行之外的任意字符,一个字符占位。

 

*:代表前面的子表达式出现0次或者多次。如果需要*代表的子表达式是多个字符,就将多个字符用()包含。

 

+:代表前面的表达式出现1次或者多次。

 

?:代表前面的表达式出现0次或者出现1次。

 

{n}:代表前面的子表达式要出现n次。

 

^代表开始$代表结束

 

{n,m}:代表前面的子表达式最少出现n次,最多出现m次。

 

{n,}:说明前面的子表达式最少出现n次,最多没有限制。

 

[]:输入的内容必须是在括号内有的一个字符。

 

():改变优先级、分组。

 

\d:代表0-9的数字。

 

\D:代表非数字。

 

\w:代表0-9a-zA-Z_中文   (经过实例证明C#里\w包含中文,JavaScript里不包含中文)

 

\W:代表其他特殊字符(除了0-9a-zA-Z_中文)

 

\s:代表看不到的字符,如:回车、空格、制表符。

 

\S:代表所有可见字符

 


 

 

正则表达式进行匹配的原则:

1.(有没有)只关注是否存在,而不关注它的位置,也就意味着只需要能够匹配其中一个就可以 。

2.贪婪模式:如果找到了能匹配的字符,那么他还继续往下匹配尽可能多的字符,只到最后

 


 

 

.net中的正则表达式

正则表达式在.net中就是用字符串来表示,这个字符串格式比较特殊,无论多么特殊,在C#语言看来都是普通的字符出,具体什么含义由Regex类内部进行语法分析。

常用的4种情况:

  1. 判断是否匹配(是否有):Regex.IsMatch("字符串","正则表达式");
  2. 字符串提取:Regex.Match("字符串","要提取的字符出的正则表达式"); ——只能提取一个(提取一次)。
  3. 字符串提取(循环提取所有):Regex.Matches(),可以提取所有匹配的字符串。
  4. 字符串替换:Regex.Replace("字符串","正则","替换内容");

 

 

提取只有一个匹配项的字符串,进行分组,提取。

        string str = "tiantianjcx@qq.com";

                Match match = Regex.Match(str, @"^(\w+)[@](\w+)[.](\w+)$");

                if (match.Success) //匹配成功

                {

                    Console.WriteLine(match.Groups[0].Value);  //结果:tiantianjcx@qq.com

                    Console.WriteLine(match.Groups[1].Value);  //结果:tiantianjcx

                    Console.WriteLine(match.Groups[2].Value);  //结果:qq

                    Console.WriteLine(match.Groups[3].Value);  //结果:com

                }

 


 

 

JavaScript正则表达式

创建:

字面值:var regex=/元字符/;

构造函数:var regex=new RegExp("元字符");

 

匹配:

bool 正则表达式对象.test("字符串");

   var regex = /\d*/;

    alert(regex.test("122"));   //true

 

提取:

像数组的对象 正则表达式对象.exec("字符串");

这个对象的[0]是匹配到的结果,[1],[2]....是各个组

1.单个提取

 

2.单个提取并分组

var str = "我的邮箱是tiantianjcx@qq.com";

    var regex = /(\w+)@(\w+[.]\w{2,3})/;

 

    var arr= regex.exec(str);

    alert(arr.length);

    for (var i = 0; i < arr.length; i++) {

        alert(arr[i]);

    }

 

3.循环提取

  var str = "我的邮箱是tiantianjcx@qq.com,你的是sukun@163.com号吧";

        var regex = /\w+@\w+[.]\w{2,3}/g;

 

        var arr = [];

        var item = null;

        while ((item = regex.exec(str)) != null) {

            arr.push(item);

        }

 

注意:创建正则表达式对象里的字符必须加上g(全局匹配),否则会陷入是循环

 

4.替换

javascript的正则替换,是使用String的Replace()方法将正则表达式作为参数处理。

var str = "a--b---------c---------------d---------------e---------------f";

        str = str.replace(/-+/g,"-");

 

  var str = "2016年7月26日";

        str = str.replace(/(\d+)年(\d+)月(\d+)日/,"$1-$2-$3");

 


 

 

自测题:

 1   /* 2        192.168.10.5[port=21,type=ftp]”,这个字符串表示IP地址为192.168.10.5的服务器的21端口提供的是ftp服务, 3        * 其中如果“,type=ftp”部分被省略,则默认为http服务。请用程序解析此字符串,然后打印出“IP地址为***的服务器的***端口提供的服务为***” 4       */ 5  6  7       string str = "192.168.10.5[port=21,type=ftp]"; 8       Match match = Regex.Match(str, @"^(\d{1,3}[.]?\d{1,3}[.]?\d{1,3}[.]?\d{1,3}[.]?)[[]\w+=(\w+),?\w*=?(\w*)[]]$"); 9       if (match.Success) //匹配成功10       {11         Console.WriteLine("IP地址为:{0}", match.Groups[1].Value);12         Console.WriteLine("端口::{0}", match.Groups[2].Value);13         if (string.IsNullOrEmpty(match.Groups[3].Value))14         {15           Console.WriteLine("端口提供的服务为:http");16         }17         else18         {19           Console.WriteLine("端口提供的服务为:{0}", match.Groups[3].Value);20         }21       }

View Code

 

 1       /* 2        读取网站的内容,用正则表达式匹配邮箱,并提取 3        * 注意:做循环匹配不能加"^"和$(开始和结束),否则就只能匹配一项 4       */ 5       string path = @"E:\视频大全\传智播客.NET2014.3.26-07.09期\6--2014-4-03 文件操作和正则表达式\资料\正则表达式-素材\正则表达式\大家留下email交友吧_email_天涯社区.htm"; 6  7       string txt = File.ReadAllText(path); 8  9       MatchCollection arr = Regex.Matches(txt, @"[a-zA-Z0-9]+[@][a-zA-Z0-9]+[.]+[a-zA-Z]{2,3}");10 11       using (Stream fs = new FileStream("E:\\mail.txt", FileMode.Create))12       using (StreamWriter sw = new StreamWriter(fs, Encoding.UTF8))13       {14 15         for (int i = 0; i < arr.Count; i++)16         {17           Match match = arr[i];18           sw.WriteLine(match.Groups[0].Value);19 20         }21       }

View Code