C#正則表達(dá)式的詳細(xì)使用說明(附示例代碼)
更新時間:2025年07月21日 08:57:25 作者:生命不息-學(xué)無止境
正則表達(dá)式是一種匹配輸入文本的模式,Net框架提供了允許這種匹配的正則表達(dá)式引擎,模式由一個或多個字符、運(yùn)算符和結(jié)構(gòu)組成,這篇文章主要介紹了C#正則表達(dá)式的詳細(xì)使用說明,需要的朋友可以參考下
正則表達(dá)式基礎(chǔ)概念
- 正則表達(dá)式是一種用于匹配文本模式的工具。它是由普通字符(例如字母、數(shù)字)和特殊字符(稱為元字符)組成的字符串模式。在C#中,主要通過
System.Text.RegularExpressions
命名空間來使用正則表達(dá)式。 - 元字符表格顯示:
分類 | 正則表達(dá)式字符 | 描述 | 示例 |
---|---|---|---|
字符類 | . | 匹配除換行符之外的任意單個字符 | a.b 可匹配aab 、acb 等 |
[abc] | 匹配字符a 、b 或c 中的任意一個 | [abc] 可匹配a 、b 、c 中的任意一個字符,如ab[abc]d 可匹配abbd 、abcd 等 | |
[0-9] | 匹配任意一個數(shù)字字符,等同于\d | [0-9] 可匹配0 -9 中的任意一個數(shù)字,如a1b 中的1 | |
[a-z] | 匹配任意一個小寫字母字符 | [a-z] 可匹配a -z 中的任意一個小寫字母,如a[abcdef]b 可匹配abc 、abd 等 | |
[^abc] | 匹配除a 、b 、c 之外的任意一個字符 | [^abc] 可匹配除a 、b 、c 之外的任意字符,如a1b 中的1 ,a#b 中的# | |
量詞 | * | 匹配前面的元素零次或多次 | ab* 可匹配a 、ab 、abb 等 |
+ | 匹配前面的元素一次或多次 | ab+ 可匹配ab 、abb 等,但不能匹配a | |
? | 匹配前面的元素零次或一次 | ab? 可匹配a 或ab | |
{n} | 匹配前面的元素恰好n 次 | a{3} 可匹配aaa | |
{n,} | 匹配前面的元素至少n 次 | a{2,} 可匹配aa 、aaa 等 | |
{n,m} | 匹配前面的元素至少n 次且不超過m 次 | a{2,4} 可匹配aa 、aaa 、aaaa | |
特殊字符 | \d | 匹配任意一個數(shù)字字符,等同于[0-9] | \d 可匹配0 -9 中的任意一個數(shù)字,如a1b 中的1 |
\D | 匹配任意一個非數(shù)字字符,等同于[^0-9] | \D 可匹配除數(shù)字以外的任意字符,如a#b 中的a 、# 、b | |
\w | 匹配任意一個字母、數(shù)字或下劃線字符,等同于[a-zA-Z0-9_] | \w 可匹配a -z 、A -Z 、0 -9 、_ 中的任意一個字符,如a1_b 中的a 、1 、_ | |
\W | 匹配任意一個非字母、數(shù)字或下劃線字符,等同于[^a-zA-Z0-9_] | \W 可匹配除字母、數(shù)字、下劃線以外的任意字符,如a#b 中的# | |
\s | 匹配任意一個空白字符,包括空格、制表符、換頁符等 | a\sb 可匹配a b ,其中中間有一個空格 | |
\S | 匹配任意一個非空白字符 | a\Sb 可匹配a#b 等,其中# 是非空白字符 | |
\b | 匹配一個單詞邊界 | \bcat\b 可匹配單獨(dú)的單詞cat ,但不能匹配category 中的cat | |
\B | 匹配一個非單詞邊界 | \Bcat\B 可匹配category 中的cat ,但不能匹配單獨(dú)的單詞cat | |
定位符 | ^ | 匹配輸入字符串的開始位置 | ^abc 可匹配以abc 開頭的字符串,如abcdef |
$ | 匹配輸入字符串的結(jié)束位置 | def$ 可匹配以def 結(jié)尾的字符串,如abcdef | |
轉(zhuǎn)義字符 | \ | 轉(zhuǎn)義特殊字符,使特殊字符按字面意思匹配 | \. 可匹配真正的句點(diǎn)字符. ,而不是表示任意字符的. |
分組與捕獲 | (...) | 字符類,匹配括號內(nèi)的任意一個字符,并將括號內(nèi)的內(nèi)容作為一個分組,可以通過Match.Groups 獲取分組內(nèi)容 | (abc) 可匹配a 、b 或c 中的任意一個字符,如a(abc)d 可匹配aabd 、aacd 等,通過分組可獲取匹配到的具體字符 |
零寬斷言 | (?=...) | 正向肯定預(yù)查,用于查找后面跟著特定模式的位置,但不消耗字符 | \d(?=abc) 可匹配后面跟著abc 的數(shù)字,如1abc 中的1 |
(?!...) | 正向否定預(yù)查,用于查找后面不跟著特定模式的位置,但不消耗字符 | \d(?!abc) 可匹配后面不跟著abc 的數(shù)字,如1def 中的1 | |
(?<=...) | 反向肯定預(yù)查,用于查找前面跟著特定模式的位置,但不消耗字符 | (?<=def)\d 可匹配前面跟著def 的數(shù)字,如def1 中的1 | |
(?<!...) | 反向否定預(yù)查,用于查找前面不跟著特定模式的位置,但不消耗字符 | (?<!def)\d 可匹配前面不跟著def 的數(shù)字,如abc1 中的1 | |
常用方法 | IsMatch | 判斷輸入字符串是否與正則表達(dá)式匹配,返回bool 值 | Regex.IsMatch("abc123", @"\d") 返回true |
Match | 在輸入字符串中查找第一個匹配項,返回Match 對象,可通過Match.Value 獲取匹配的值,Match.Index 獲取匹配位置等 | Regex.Match("abc123", @"\d") 可獲取到第一個數(shù)字1 的相關(guān)匹配信息 | |
Matches | 在輸入字符串中查找所有匹配項,返回MatchCollection 集合,可遍歷獲取每個匹配項的信息 | Regex.Matches("abc123", @"\d") 可獲取到所有數(shù)字1 、2 、3 的匹配信息 | |
Replace | 將輸入字符串中匹配正則表達(dá)式的部分替換為指定的字符串 | Regex.Replace("abc123", @"\d", "#") 可將abc123 替換為abc### | |
Split | 根據(jù)正則表達(dá)式將輸入字符串分割成字符串?dāng)?shù)組 | Regex.Split("a1b2c3", @"\d") 可將字符串分割為{"a", "b", "c"} |
在C#中使用正則表達(dá)式的基本步驟
- 引入命名空間:在C#代碼中使用正則表達(dá)式,首先需要引入
System.Text.RegularExpressions
命名空間。例如:
using System.Text.RegularExpressions;
- 創(chuàng)建正則表達(dá)式對象:使用
Regex
類來創(chuàng)建正則表達(dá)式對象??梢酝ㄟ^傳遞一個正則表達(dá)式模式字符串來創(chuàng)建。例如,要匹配一個簡單的電話號碼格式(假設(shè)電話號碼是數(shù)字,長度為7 - 8位),可以這樣創(chuàng)建:
Regex phoneRegex = new Regex(@"^\d{7,8}$");
- 這里
@
符號是C#中的逐字字符串字面量,它告訴編譯器這個字符串中的轉(zhuǎn)義字符(如\
)應(yīng)該按照字面意思處理,而不是作為C#中的轉(zhuǎn)義字符。^
表示匹配字符串的開始,\d
表示數(shù)字,{7,8}
表示前面的元素(數(shù)字)出現(xiàn)7到8次,$
表示匹配字符串的結(jié)束。 - 進(jìn)行匹配操作:
- 使用IsMatch方法判斷是否匹配:例如,判斷一個字符串是否是符合上述格式的電話號碼。
string phoneNumber = "1234567"; bool isMatch = phoneRegex.IsMatch(phoneNumber); if (isMatch) { Console.WriteLine("是有效的電話號碼"); } else { Console.WriteLine("不是有效的電話號碼"); }
- 使用Match和Matches方法獲取匹配結(jié)果:
Match
方法返回第一個匹配項。例如,從一段文本中獲取第一個符合電子郵件格式的字符串(簡單示例)。
string text = "我的郵箱是test@example.com,還有一個無效郵箱abc"; Regex emailRegex = new Regex(@"[a - zA - Z0 - 9_.]+@[a - zA - Z0 - 9_.]+\.[a - zA - Z]+"); Match match = emailRegex.Match(text); if (match.Success) { Console.WriteLine("找到的郵箱是: " + match.Value); }
Matches
方法返回所有匹配項的集合。例如,從一段文本中獲取所有的數(shù)字。
string numberText = "abc123def456"; Regex numberRegex = new Regex(@"\d+"); MatchCollection matches = numberRegex.Matches(numberText); foreach (Match match in matches) { Console.WriteLine(match.Value); }
正則表達(dá)式的高級用法
- 分組(Grouping):使用括號
()
可以將正則表達(dá)式的一部分進(jìn)行分組。分組可以用于提取匹配的特定部分或者在匹配過程中應(yīng)用量詞到一組字符上。例如,在匹配日期格式(假設(shè)為yyyy - MM - dd
)時,可以這樣分組來提取年、月、日。
string dateText = "2024-05-10"; Regex dateRegex = new Regex(@"(\d{4})-(\d{2})-(\d{2})"); Match match = dateRegex.Match(dateText); if (match.Success) { Console.WriteLine("年: " + match.Groups[1].Value); Console.WriteLine("月: " + match.Groups[2].Value); Console.WriteLine("日: " + match.Groups[3].Value); }
- 零寬斷言(Zero - width Assertions):這是一種特殊的匹配方式,它不消耗字符,只是在某個位置進(jìn)行斷言。例如,
(? =...)
是正向肯定預(yù)查,它用于查找后面跟著特定模式的位置。假設(shè)要找到后面跟著abc
的數(shù)字,可以這樣寫:
string assertText = "1abc 2def"; Regex assertRegex = new Regex(@"\d(? =abc)"); MatchCollection matches = assertRegex.Matches(assertText); foreach (Match match in matches) { Console.WriteLine(match.Value); }
- 替換匹配的文本(Regex.Replace):可以使用
Regex.Replace
方法來替換匹配正則表達(dá)式的文本部分。例如,將一段文本中的所有數(shù)字替換為#
。
string replaceText = "abc123def"; string replaced = Regex.Replace(replaceText, @"\d", "#"); Console.WriteLine(replaced);
總結(jié)
到此這篇關(guān)于C#正則表達(dá)式的詳細(xì)使用說明的文章就介紹到這了,更多相關(guān)C#正則表達(dá)式使用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳解c#中Array,ArrayList與List<T>的區(qū)別、共性與相互轉(zhuǎn)換
本文詳細(xì)講解了c#中Array,ArrayList與List<T>的區(qū)別、共性與相互轉(zhuǎn)換,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-12-12詳解如何使用BenchmarkDotNet對.NET代碼進(jìn)行性能基準(zhǔn)測試
BenchmarkDotNet是一個基于.NET開源、功能全面、易于使用的性能基準(zhǔn)測試框架,這篇文章就來和小編一起學(xué)習(xí)一下如何使用BenchmarkDotNet對.NET代碼進(jìn)行性能基準(zhǔn)測試吧2024-12-12