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.匹配中文
[\u4E00-\u9FFF]
正则表达式进行匹配的原则:
1.(有没有)只关注是否存在,而不关注它的位置,也就意味着只需要能够匹配其中一个就可以 。
2.贪婪模式:如果找到了能匹配的字符,那么他还继续往下匹配尽可能多的字符,只到最后
.net中的正则表达式
正则表达式在.net中就是用字符串来表示,这个字符串格式比较特殊,无论多么特殊,在C#语言看来都是普通的字符出,具体什么含义由Regex类内部进行语法分析。
常用的4种情况:
- 判断是否匹配(是否有):Regex.IsMatch("字符串","正则表达式");
- 字符串提取:Regex.Match("字符串","要提取的字符出的正则表达式"); ——只能提取一个(提取一次)。
- 字符串提取(循环提取所有):Regex.Matches(),可以提取所有匹配的字符串。
- 字符串替换: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");
自测题:
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
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 else 18 { 19 Console.WriteLine("端口提供的服务为:{0}", match.Groups[3].Value); 20 } 21 }
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
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 }