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");
自測題:

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 }

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 }
文章列表