程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C#中正則表達式的3種婚配形式

C#中正則表達式的3種婚配形式

編輯:C#入門知識

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)

總結:

最初我們用一個表格來總結一下這三個形式

界說 影響的表達式 RegexOptions列舉 嵌入標識符 單行形式 更改點 (.) 的寄義,使它與每個字符婚配(而不是與除 \n 以外的每一個字符婚配)。 Singleline (?s) 多行形式 更改 ^ 和 $ 的寄義,使它們分離在隨意率性一行的行首和行尾婚配,而不只僅在全部字符串的開首和開頭婚配。 Multiline (?m) 疏忽年夜小寫 指定不辨別年夜小寫的婚配。 IgnoreCase (?i)

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved