C#正則表達式用法入門大全
正則表達式
(這部分內(nèi)容難以理解,想要講透還是比較困難,請跟隨貼主一步一步探尋)
首先我們要知道正則表達式能夠做什么?
- 查找:在文本中找到特定模式的內(nèi)容
- 替換:將符合某種模式的文本替換為其他內(nèi)容
- 驗證:檢查輸入的數(shù)據(jù)是否符合預(yù)期格式
- 提?。?/strong>從復(fù)雜文本中提取需要的信息
總的來說就是用于模式匹配和搜索文本的一個工具,也可以把它想作是一個 超級通配符
對于通配符舉一個簡單的例子,也常常發(fā)生在我們查找文件的過程
//像查找 data(\w)?\.dat 這種,你可能會查到以下形式的文件 data.dat data1.dat data2.dat datax.dat dataN.dat //而像查找 data.*\.dat 這種,你可能會查到以下形式的文件 data.dat data1.dat data2.dat data12.dat datax.dat dataXYZ.dat // ? 通配符匹配文件名中的 0 個或 1 個字符,而 * 通配符匹配零個或多個字符
從上述的搜索結(jié)果很容易看出,通配符確實具有它的強大,但是也存在相應(yīng)限制。假如類似文件名很多,也是日常中常會碰到的這種情況下,定位到指定文件夾就顯得較為困難。
這也就是為什么我們會在引入“超級通配符”,即正則表達式。
想要學(xué)習(xí)正則表達式,我們要從一個簡單的正則表達式開始認識。

- ^ 為匹配輸入字符串的開始位置
- [0-9]+匹配多個數(shù)字, [0-9] 匹配單個數(shù)字,+ 匹配一個或者多個
- abc$匹配字母 abc 并以 abc 結(jié)尾,$ 為匹配輸入字符串的結(jié)束位置
以上這個簡單的正則表達式其實在生活中常常會遇到,只是大家都沒有過多去關(guān)心這背后的實現(xiàn)原理。以貼主自己為例,打游戲無法取到心儀的名字也正是它在“搗鬼”,hhh
言歸正傳
由上面的簡單正則表達式進一步進階為下面的表達式

- ^表示匹配字符串的開頭
[a-zA-Z0-9_-]表示字符集,包含小寫字母、大寫字母、數(shù)字、下劃線_和連接字符-{3,15}表示前面的字符集最少出現(xiàn) 3 次,最多出現(xiàn) 15 次,從而限制了用戶名的長度在 3 到 15 個字符之間$表示匹配字符串的結(jié)尾
以上的正則表達式匹配 runoob、runoob1、run-oob、run_oob等,但不匹配 ru、 runoob$等
當(dāng)然正則表達式的日常使用遠不止上面的這些,它也有它自己的元字符和特性

看到這個表格,相信很多小伙伴就會比較焦慮,這么多都需要記住嗎?確切的來說是,但又不是。因為這個東西本就是孰能生巧的一個過程,當(dāng)你用多了,它自然就會在你腦子里留下印象,你自然也就記住了。就好比貼主之前不會做飯,食材和調(diào)料放什么怎么放都不知道,但后來迫于生活的壓力不得不自己做,于是慢慢就會了,也就記住了。這是一個道理,hhh
有了前面的基礎(chǔ),相信你對正則表達式已經(jīng)有了一個比較確切的認識,由于目前以C#語言為主,故后面的內(nèi)容圍繞C#展開,不同語言可能用法有所不同,但是底層的邏輯基本都是一致的。下面的內(nèi)容會略微枯燥,但是貼主已經(jīng)盡力挑最精華的部分講,請耐心看完。
1、字符類

上述不好理解的應(yīng)該主要是\p{name}和\P{name},一個是與 name 指定的 Unicode 通用類別或命名塊中的任何單個字符匹配,而另一個則相反,與不在 name 指定的 Unicode 通用類別或命名塊中的任何單個字符匹配。在 Unicode 標準中,Lu 代表 "Letter, uppercase"(大寫字母)。也就有了上面的結(jié)果。具體遇到了之后可以通過查閱資料得知。

2、字符轉(zhuǎn)義

下面所列舉的是歷史遺留的控制字符 (在日常中較少用,可要到后再前往學(xué)習(xí)即可)
\a(報警/響鈴):早期終端遇到這個字符會發(fā)出“滴”的響聲\v(垂直制表符) 和\f(換頁符):早期用于控制打印機紙張的滾動\e(轉(zhuǎn)義符 Escape):匹配 ASCII 里的 ESC 鍵控制碼\c X(ASCII 控制字符):用于匹配按鍵組合。例如\cC匹配Ctrl + C產(chǎn)生的控制字符\b(退格符 Backspace):注意這里有一個非常關(guān)鍵的細節(jié)! 在正則表達式中,\b通常代表“單詞邊界”(比如匹配整個單詞)。只有當(dāng)它被放在方括號內(nèi),寫成[\b]時,它才代表鍵盤上的“退格鍵”(Backspace)。圖片中的描述特意強調(diào)了“在字符類中”,就是指放在[]里面。
當(dāng)您的鍵盤打不出某個字符,或者您想極其精確地指定某個字符時,可以使用它的計算機底層編碼來匹配。這三種方式本質(zhì)上是一樣的,只是進制不同:
\x nn(十六進制):用兩位十六進制數(shù)表示字符。例如\x20代表空格(ASCII碼 32 的十六進制是 20)\u nnnn(Unicode):用四位十六進制數(shù)表示全球統(tǒng)一的 Unicode 字符。例如\u0020同樣代表普通空格。它也可以用來匹配中文等復(fù)雜字符(如\u4e00代表漢字“一”)\nnn(八進制):用兩到三位八進制數(shù)表示。例如\040代表空格(32的八進制是40)。這種寫法現(xiàn)在相對少見了
這些是我們?nèi)粘L幚砦谋緯r最常遇到的不可見字符:
\n(換行符, Newline):代表我們在鍵盤上按下 Enter 鍵換行。匹配下一行開始的位置\r(回車符, Carriage Return):在 Windows 系統(tǒng)中,換行通常是\r\n連用的;而在 Linux/macOS 中通常只有\n。圖中的例子\r\n就是用來匹配 Windows 風(fēng)格的換行\r(回車符, Carriage Return):在 Windows 系統(tǒng)中,換行通常是\r\n連用的;而在 Linux/macOS 中通常只有\n。圖中的例子\r\n就是用來匹配 Windows 風(fēng)格的換行
萬能的“取消魔法”符:
\(反斜杠本身):這是極其重要的一點。如果想在文本中尋找真正的加號+或者星號*,不能直接寫+,因為正則會以為您要“匹配前一個字符一次或多次”。必須寫成\+或\*。圖中例子解析:在舉例\d+[\+-x\*]\d+中,\+和\*就是告訴正則:“我不是要用你們的魔法規(guī)則,我就是要找文本里長得像加號和星號的符號”。所以它能成功匹配出數(shù)學(xué)算式"2+2"和"3*9"。
3、定位點

基礎(chǔ)行邊界 (最常用):
- ^(脫字符):匹配字符串或一行的絕對開頭
$(美元符):匹配字符串或一行的絕對結(jié)尾
絕對字符串邊界 (應(yīng)對多行文本):
\A:只匹配整個字符串的絕對開頭。無論換不換行,它只認整個文本的第一個位置\Z:匹配整個字符串的結(jié)尾,或者如果文本最后有一個換行符\n,它會匹配在換行符之前\z:比\Z更嚴格,匹配字符串的終極末尾,哪怕最后有換行符,它也匹配在換行符的后面
單詞邊界 (處理英文單詞極佳):
\b(Word Boundary):匹配單詞邊界。圖中舉例:er\b。這意味著"er"的后面必須跟著一個邊界(比如空格或句號)。所以在單詞"never"中,最后的"er"符合要求;但在單詞"verb"中,"er"后面跟著"b"(是個字母,不是邊界),所以無法匹配\B(Non-word Boundary):匹配非單詞邊界(即單詞的內(nèi)部)
連續(xù)匹配邊界 (進階用法):
\G:匹配必須從上一次匹配結(jié)束的那個位置接著開始。這通常用于要求一連串特定格式的連續(xù)出現(xiàn),中間不能斷開
4、分組構(gòu)造

捕獲與非捕獲分組 (基礎(chǔ)核心):
( )普通捕獲組:不僅將多個字符組合成一個整體(以便在后面加*或?等量詞),還會記?。ú东@)匹配到的內(nèi)容。舉例解析:(\w)\1。\w匹配任意字母,加上括號后它就成了一號捕獲組。后面的\1叫做反向引用,意思是“這里必須出現(xiàn)和第一組一模一樣的內(nèi)容”。所以它能匹配連續(xù)相同的兩個字母,如"ee"。(?<name>)命名捕獲組:功能同上,但給這個組起了一個名字,方便以后在代碼里直接用名字提取數(shù)據(jù),而不是數(shù)數(shù)字。舉例解析:(?<double>\w)\k<double>。給捕獲組起名叫double,后面的\k<double>就是通過名字來引用它。(?: )非捕獲組:只起到“把幾個字符打包”的作用,不記住匹配的內(nèi)容,也不占用組號。這可以節(jié)省系統(tǒng)資源,提高匹配效率。舉例解析:Write(?:Line)?。匹配 "Write" 或者 "WriteLine"。"Line" 被打包,后面的?表示 "Line" 出現(xiàn) 0 次或 1 次,但不會捕獲 "Line" 這個詞。
環(huán)視 / 零寬斷言 (高級條件檢查):
(?= )正預(yù)測先行(Lookahead):要求當(dāng)前位置的后面必須出現(xiàn)指定內(nèi)容。舉例解析:\w+(?=\.)。匹配一個單詞\w+,但條件是這個單詞后面必須緊跟一個英文句號\.。注意,匹配結(jié)果中不包含這個句號(只提取"is",不提取"is.")。(?! )負預(yù)測先行(Negative Lookahead):要求當(dāng)前位置的后面不能出現(xiàn)指定內(nèi)容。舉例解析:\b(?!un)\w+\b。匹配一個完整的單詞,但條件是這個單詞不能以 "un" 開頭。(?<= )正回顧后發(fā)(Lookbehind):要求當(dāng)前位置的前面必須出現(xiàn)指定內(nèi)容。舉例解析:(?<=19)\d{2}\b。匹配兩位數(shù)字\d{2},但條件是這倆數(shù)字前面必須是 "19"。它巧妙地從四位數(shù)年份中只提取出 19XX 年的后兩位。(?<! )負回顧后發(fā)(Negative Lookbehind):要求當(dāng)前位置的前面不能出現(xiàn)指定內(nèi)容。舉例解析:(?<!wo)man\b。匹配單詞 "man",但條件是它前面不能有 "wo",這樣就排除了 "woman"。
選項修改與原子組 (性能與修飾):
(?i: )局部修飾符:允許您只在特定部分開啟某種模式(如大小寫不敏感i)。舉例解析:A\d{2}(?i:\w+)\b。開頭的A必須大寫,但(?i:\w+)這部分內(nèi)的字母可以不區(qū)分大小寫。(?> )原子組(固化分組):一旦匹配成功,就鎖定結(jié)果,禁止引擎“回溯”(反悔重新嘗試)。主要用于處理極其復(fù)雜的正則以防止引擎陷入死循環(huán)(即災(zāi)難性回溯),通常在做極致的性能優(yōu)化時使用。
平衡組 (特殊引擎專屬):
(?<name1-name2>)平衡組:這是 .NET 等少數(shù)高級正則引擎特有的功能,通常用于匹配成對出現(xiàn)的括號或標簽(如 HTML 標簽匹配)。邏輯非常復(fù)雜,相當(dāng)于正則內(nèi)部維持了一個棧來記錄左括號和右括號的數(shù)量。通常在日常簡單的文本處理中較少用到。
5、限定符

限定符理解相對容易,再前面的元字符也有類似介紹,在此不過多贅述
6、反向引用構(gòu)造
反向引用如果細心的伙伴可能再先前講述其它正則表達的時候就能夠注意到
- \ number:前面的舉例解析:
(\w)\1。\w匹配任意字母,加上括號后它就成了一號捕獲組。后面的\1叫做反向引用,意思是“這里必須出現(xiàn)和第一組一模一樣的內(nèi)容”。所以它能匹配連續(xù)相同的兩個字母,如"ee"。 - \k< name >:前面的舉例解析:
(?<double>\w)\k<double>。給捕獲組起名叫double,后面的\k<double>就是通過名字來引用它。
7、替換

提取并重組子字符串 (最常用):
$number:按序號引用捕獲組。舉例解析:模式匹配了三個組(單詞、空格、單詞)。輸入是"one two"。替換模式$3$2$1的意思是:先放第 3 組("two"),再放第 2 組(空格),最后放第 1 組("one")。結(jié)果成功將兩詞互換成了"two one"。${name}:按名字引用捕獲組。和上面原理一樣,只不過把數(shù)序號變成了喊名字,代碼可讀性更好。
利用上下文信息進行高級替換:
$&(包含自己):代表剛剛匹配到的那一段文本本身。比如您想給匹配到的金額前加星號,就可以用**$&。$`(左側(cè)內(nèi)容):代表匹配文本左邊的所有內(nèi)容。舉例解析:匹配到"BB",左邊是"AA"。所以把"BB"替換成了"AA"。最后拼接起來變成了"AA"(原左側(cè))+"AA"(替換后的BB)+"CC"(原右側(cè)) ="AAAACC"。$'(右側(cè)內(nèi)容):代表匹配文本右邊的所有內(nèi)容。舉例解析:匹配到"BB",右邊是"CC"。把"BB"替換成"CC"。拼接后變成"AA"+"CC"+"CC"="AACCCC"。$_(全部內(nèi)容):代表整個最初輸入的字符串。舉例解析:把"BB"替換成完整的"AABBCC"。結(jié)果就變成了"AA"+"AABBCC"+"CC"="AAAABBCCCCC"。
特殊符號處理:
$$:因為$符號在替換語句里變成了“魔法符號”(用來指代變量),所以當(dāng)您真的只想在文本里打印一個普通的$金額符號時,必須連寫兩個$$來“取消魔法”(類似于之前講的\轉(zhuǎn)義字符)。舉例解析:替換模式$$$1中,前兩個$$會變成一個真正的普通字符$,后面的$1是引用第一個數(shù)字捕獲組。因此把"103 USD"完美替換成了"$103"。
以上列舉的都是正則表達式中貼主個人認為比較重要且可能會常用到的,但是仍然存在一些關(guān)于正則表達式?jīng)]有講到的內(nèi)容。該部分內(nèi)容就需要大家在遇到后自己借助資料和AI學(xué)習(xí),也歡迎在評論區(qū)補充。
相信在看完整個文章后,你已經(jīng)對正則表達式已經(jīng)有了較為深入的理解。雖然正則表達式理解具有一定的困難,但當(dāng)你真正理解后它也就還好。雖然內(nèi)容較多,但是在當(dāng)今AI時代,AI可以幫你很好的彌補記憶不牢固這一缺陷,并且也能幫你快速撿起以前學(xué)過的東西。
總結(jié)
到此這篇關(guān)于C#正則表達式用法入門大全的文章就介紹到這了,更多相關(guān)C#正則表達式內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C#使用Spire.XLS for .NET將Excel轉(zhuǎn)換為SVG圖片
在C#開發(fā)中,C# Excel轉(zhuǎn)換為SVG的需求日益增長,尤其Web應(yīng)用中Excel矢量預(yù)覽已成為痛點解決關(guān)鍵,本文客觀分享實現(xiàn)路徑與代碼,幫助C#開發(fā)者快速集成,提升項目效率,需要的朋友可以參考下2026-03-03
C# string轉(zhuǎn)換為幾種不同編碼的Byte[]的問題解讀
這篇文章主要介紹了C# string轉(zhuǎn)換為幾種不同編碼的Byte[]的問題解讀,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-02-02
Unity3D Shader實現(xiàn)掃描顯示效果(2)
這篇文章主要為大家詳細介紹了Unity3D Shader實現(xiàn)掃描顯示效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-03-03
C# ping網(wǎng)絡(luò)IP 實現(xiàn)網(wǎng)絡(luò)狀態(tài)檢測的方法
下面小編就為大家?guī)硪黄狢# ping網(wǎng)絡(luò)IP 實現(xiàn)網(wǎng)絡(luò)狀態(tài)檢測的方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-08-08

