正則表達式可以看做一種有特定功能的小型編程語言,在一段文本中定位子字符串。利用正則表達式可以快速地分析大量的文本以找到特定的字符模式;提取、編輯、替換或刪除文本子字符串;或將提取的字符串添加到集合。正則表達式的基本語法可參見:深入淺出之正則表達式(一),深入淺出之正則表達式(二)。
C#命名空間System.Text.RegularExpressions提供了支持正則表達式操作的類。這些類主要包括Regex,MatchCollection,Match,GroupCollection,Group,CaputerCollection和Caputer,下圖表示了這些類之間的關系。
正則表達式很重要的一個應用就是在文本中提取字符串,這一功能的實現主要是靠Match類和Group類,因此理解匹配和組的概念很重要。要實現在一段文本中查找URL功能,這個例子比較簡單,只要調用Regex.Matches()方法就可以找到URL的集合。示例代碼如下:
文本中提取URL的
public static void Main(string[] args)
{
string text = "I've found this amazing URL at http://www.sohu.com ,and then find ftp://ftp.sohu.com is better.";
string pattern = @"\b(\S+)://(\S+)\b"; //匹配URL的模式
MatchCollection mc = Regex.Matches(text, pattern); //滿足pattern的匹配集合
Console.WriteLine("文本中包含的URL地址有:");
foreach (Match match in mc)
{
Console.WriteLine(match.ToString());
Console.Read();
}
/*
* 運行後輸出如下:
* 文本中包含的URL地址有:
* http://www.sohu.com
* ftp://ftp.sohu.com
*/}
現在,要求變了,不僅要找出URL,還要找出每個URL的協議和域名地址,這時就要用到正則表達式的分組功能了。分組是要匹配的模式pattern用小括號括起來,分成不同的組,如可以把上面例子中的模式改為:string pattern = @"\b(?<protocol>\S+)://(?<address>\S+)\b"; 這樣就用括號分成了兩個組(實際上是三個組,因為匹配本身可以看做一個大組),"?<protocol>"和"?<address>"定義了每個組的別名protocol和address,這不是必須的,只是方便我們獲取需要的組。示例代碼如下:
提取URL協議和地址的示例
public static void Main(string[] args)
{
string text = "I've found this amazing URL at http://www.sohu.com ,and then find ftp://ftp.sohu.com is better.";
string pattern = @"\b(?<protocol>\S+)://(?<address>\S+)\b"; //匹配URL的模式,並分組
MatchCollection mc = Regex.Matches(text, pattern); //滿足pattern的匹配集合
Console.WriteLine("文本中包含的URL地址有:");
foreach (Match match in mc)
{
GroupCollection gc = match.Groups;
string outputText = "URL:" + match.Value + ";Protocol:" + gc["protocol"].Value + ";Address:" + gc["address"].Value;
Console.WriteLine(outputText);
}
Console.Read();
}
/**
* 運行後輸出如下:
* 文本中包含的URL地址有:
* URL:http://www.sohu.com;Protocol:http;Address:www.sohu.com
* URL:ftp://ftp.sohu.com;Protocol:ftp;Address:ftp.sohu.com
*/