C#中正則表達式的3種婚配形式。本站提示廣大學習愛好者:(C#中正則表達式的3種婚配形式)文章只能為提供參考,不一定能成為您想要的結果。以下是C#中正則表達式的3種婚配形式正文
在C#中,我們普通應用Regex類來表現一個正則表達式。普通正則表達式引擎支撐以下3種婚配形式:單行形式(Singleline)、多行形式(Multiline)與疏忽年夜小寫(IgnoreCase)。
1. 單行形式(Singleline)
MSDN界說:更改點 (.) 的寄義,使它與每個字符婚配(而不是與除 \n 以外的每一個字符婚配)。
應用單行形式的典范場景是獲得網頁源碼中的信息。
示例:
我們應用WebBrowser控件,從http://www.xxx.com/1.htm上獲得了以下HTML源碼,它存儲在變量str中:
<html>
<body>
<div>
Line 1
Line 2
</div>
</body>
</html>
我們想把div標簽和個中的內容提掏出來,編寫代碼以下:
string pattern = @"<div>.*</div>";
Regex regex = new Regex(pattern);
if (regex.IsMatch(str))
Console.WriteLine(regex.Match(str).Value);
else
Console.WriteLine("Mismatch!");
//成果為:Mismatch!
毛病剖析:
普通以為點符號(.)是婚配隨意率性單個字符的,而(.*)就是婚配隨意率性多個字符。但現實上點符號不克不及婚配換行符。在Windows中與它等效的表達式為[^\r\n]。
而我們從網站上獲得的HTML源碼,少少有不換行的。這時候候單行形式派上用處了,它可以轉變點符號的意義。修正regex實例的結構函數,用RegexOptions.Singleline來聲明應用單行形式:
string pattern = @"<div>.*</div>";
Regex regex = new Regex(pattern, RegexOptions.Singleline);
if (regex.IsMatch(str))
Console.WriteLine(regex.Match(str).Value);
else
Console.WriteLine("Mismatch!");
/*
成果為:
<div>
Line 1
Line 2
</div>
*/
單行形式的嵌入潤飾符:
我們可以直接在正則表達式中嵌入單行形式:
(?s)<div>.*</div>
(?s)潤飾符解釋,厥後面的表達式采取單行形式。所以應用時請不要將它放在末尾。別的可使用(?-s)封閉單行形式。
留意:嵌入形式的優先級要高於Regex類的RegexOptions設置,所以應用了(?s)後,不管能否應用RegexOptions.Singleline,均依照單行形式解析。
2. 多行形式(Multiline)
MSDN界說:更改 ^ 和 $ 的寄義,使它們分離在隨意率性一行的行首和行尾婚配,而不只僅在全部字符串的開首和開頭婚配。
示例:
有一個文本文件,它的每行是一個用戶名,將文件讀入變量str中停止處置。其內容以下:
二十四畫生
TerryLee
莫相會
Dflying Chen
Rainy
借用博客園列位先輩的年夜名:)
我們想找出一個應用英文字母開首的用戶名,編寫代碼以下:
string pattern = @"^[A-Za-z]+.*";
Regex regex = new Regex(pattern);
if (regex.IsMatch(str))
Console.WriteLine(regex.Match(str).Value);
else
Console.WriteLine("Mismatch!");
//成果為:Mismatch!
毛病剖析:
(^)是字符串的肇端錨定,str的第一個字符是一個中文字,所以婚配不上。我們便可以應用多行形式來轉變(^)的寄義,使它婚配每行的肇端,而不是全部字符串的肇端。
更改代碼以下:
string pattern = @"^[A-Za-z]+.*";
Regex regex = new Regex(pattern, RegexOptions.Multiline);
if (regex.IsMatch(str))
Console.WriteLine(regex.Match(str).Value);
else
Console.WriteLine("Mismatch!");
//成果為:TerryLee
同時,多行形式也會轉變($)的寄義,使它婚配每行的開頭,而不是全部字符串的開頭。
與(^)和($)分歧的是,(\A)和(\Z)其實不受多行形式的影響,永久婚配全部字符串的肇端和開頭。
多行形式的嵌入潤飾符:(?m)與(?-m)
3. 疏忽年夜小寫(IgnoreCase)
MSDN界說:指定不辨別年夜小寫的婚配。
這個形式很輕易懂得,它以為年夜小寫字符是雷同的。我們仍以上例來講明。
示例:
string pattern = @"^[a-z]+.*";
Regex regex = new Regex(pattern, RegexOptions.Multiline | RegexOptions.IgnoreCase);
if (regex.IsMatch(str))
Console.WriteLine(regex.Match(str).Value);
else
Console.WriteLine("Mismatch!");
//成果為:TerryLee
剖析:請留意此次應用的正則表達式,我們並沒有寫入年夜寫字母,但卻婚配了以年夜寫字母開首的名字,這就是疏忽年夜小寫的後果。
疏忽年夜小寫的嵌入潤飾符:(?i)與(?-i)
總結:
最初我們用一個表格來總結一下這三個形式