C#正則表示式入門(上)
一、說明
使用正則表示式 需要包含名字空間using System.Text.RegularExpressions;
.Net使用的是傳統型NFA引擎,.NET正則表示式流派概述
分類 |
舉例 |
字元縮略表示法 |
\a [\b] \e \f \n \r \t \v\octal \x## \u#### \cchar |
字元組及相關 |
字元組:[…] [^…] 幾乎任何字元:.(點號) 字元組縮略表示法:\w表達字母 ;\d表示數字;\W表示非字母;\D表示非數字 Unicode屬性和區塊:\p{Prop} |
錨點及其它零長度斷言 |
行/字串其實位置:^ \A 行/字串結束位置:$ \z \Z 當前匹配的起始位置:\G 單詞分節符:\b \B 環視結構:(?=…) 順序環視;(?!...)順序否定環視;(?<=…) 逆序環視;(?<!...) 逆序否定環視 |
註釋及模式修飾符 |
模式修飾符:(?mods-mods) 容許出現的模式:x s m I n 模式修飾範圍:(?mods-mods:…) 註釋:(?#...) |
分組及捕獲 |
捕獲型括號:(…) \1 \2 對稱分組:(?<name-name>…) 命令捕獲及回溯:(?<name>…) \k<name> 近分組的括號:(?:…) 固化分組:(?>…) 多選結構:| 匹配優先量詞:*(出現任意次,包括0次);+(至少出現一次);?(至多出現1次,即0次或1次);{n}(必須出現n次);{n,}(至少出現n次);{x,y}(至少出現x次,至多出現y次) 忽略優先量詞:*? +? ?? {n}? {n,}? {x,y}? 條件判斷:(?if then | else) ----if可以是環視、(num)或(name) |
.Net的匹配模式和正則表示式模式
RegexOptions選項 |
(?mode) |
說明 |
.Singleline |
s |
點號能夠匹配任何字元,包括換行符 |
.Multiline |
m |
擴充套件^和$的匹配,使之可以匹配內部換行符 |
.IgnorePatternWhitespace |
x |
設定寬鬆排列和註釋模式 |
IgnoreCase |
i |
進行不卻分大小寫的匹配 |
.ExplicitCapture |
n |
關閉(…)的捕獲功能,只有(?<name>)能夠捕獲 |
.ECMAScript |
|
限制\w、\s和\d只對ASCII字元有效 |
.RightToLeft |
|
從字串末尾開始向開頭進行匹配 |
.Compiled |
|
進行編譯,可以提升匹配速度,但是佔用跟多記憶體資源 |
二、Replace函式
string value=”<item>SCUT華工計算機computer</item>大學<nodes> &%*Ghksadf</item>”;
string newValue = Regex.Replace(value, "<[^>]*>|</[^>]*>", "");
注:上面正則表示式目的是去掉所有<item></item>等標籤,這在提取網頁內容時候經常用到,並且上面匹配中<[^>]*>表示匹配從<開始並且最近的一個>,中間可以有任意個字元,|符號表示或,就是去掉”<任意字元>”及”</任意字元>”這樣的標籤。
三、Match函式
在輸入字串中搜索正則表示式的匹配項,並將精確結果作為單個 Match 物件返回。
過載列表:
(1) 在指定的輸入字串中搜索 Regex 建構函式中指定的正則表示式匹配項。
[C#] public Match Match(string);
(2) 從指定的輸入字串起始位置開始在輸入字串中搜索正則表示式匹配項。
[C#] public Match Match(string, int);
(3) 在指定的輸入字串中搜索 pattern 引數中提供的正則表示式的匹配項。
[C#] public static Match Match(string, string);
(4) 從指定的輸入字串起始位置開始在輸入字串中搜索具有指定輸入字串長度的正則表示式匹配項。
[C#] public Match Match(string, int, int);
(5) 在輸入字串中搜索 pattern 引數中提供的正則表示式的匹配項(匹配選項在 options 引數中提供)。
[C#] public static Match Match(string, string, RegexOptions);
【例一】取出網頁中的Title屬性
Match TitleMatch = Regex.Match(fileContents, "<title>([^<]*)</title>", RegexOptions.IgnoreCase | RegexOptions.Multiline );
filetitle = TitleMatch.Groups[1].Value;
注意紅色的1, Regex.Match方法得到的Groups的索引是從1開始的,而不是從0開始的。
【例二】
string no=”<td colspan=”2”>華工計算機\t\t\n學院\t\t\n\n電腦科學與技術\t</td>”;
Match matchTmp;
matchTmp = Regex.Match(no, "<td colspan=\"2\">.*?</td>",RegexOptions.Singleline);
注:
RegexOptions.Singleline:指定單行模式。更改點 (.) 的含義,使它與每一個字元匹配(而不是與除 \n 之外的每個字元匹配)。 這是MSDN上面的解釋。在正則表示式中"."是與"\n"之外的所有字元匹配的。當使用Singleline的時候,在使用"."的情況下會實現跨行匹配,在使用Multiline的時候不會實現跨行匹配;
RegexOptions.Multiline:多行模式。更改 ^ 和 $ 的含義,使它們分別在任意一行的行首和行尾匹配,而不僅僅在整個字串的開頭和結尾匹配(MSDN)。 在正則表示式中,"^"和 "$"表示匹配文字的開頭的結束,但是在Multiline的情況下是在任意一行的行首和行尾匹配。
【例三】
StringBuilder input = new StringBuilder();
input.AppendLine("These is the first test line");
input.AppendLine("These is the second test line");
string pattern2 = @"ne.*";
MatchCollection matchCol = Regex.Matches(input.ToString(), pattern2,RegexOptions.Singleline);
foreach (Match item in matchCol)
{
Console.WriteLine("結果:{0}",item.Value);
}
結果:在是Singleline的情況下,匹配的結果是ne These is the second test line;在不是Singleline的情況下,匹配的結果是ne
【例四】
Match tmp = Regex.Match(mt.Value, "(src|data-src)=(\")?(.*?)(\"|\\s|$)",
RegexOptions.IgnoreCase);//再次匹配,獲取圖片連結
string res = tmp.Groups[3].Value;
說明:上面的語句中res的值為第三個括號中匹配的結果