.NETCore C# 中級篇2-4 一文帶你完全弄懂正則表達式

来源:https://www.cnblogs.com/WarrenRyan/archive/2019/08/14/11352635.html
-Advertisement-
Play Games

.NETCoreCSharp 中級篇2 4 本節內容為正則表達式的使用 簡介 有的時候,你是否有過這種需求:判斷一個Ip地址、郵箱、密碼規則是否合法。如果讓你使用if一類的傳統方法進行處理,你肯定會被逼瘋的。而對於絕大多數的編程語言而言,都有一個字元串處理利器————正則表達式。它可以輕鬆的讓字元串 ...


.NETCoreCSharp 中級篇2-4

本節內容為正則表達式的使用

簡介

有的時候,你是否有過這種需求:判斷一個Ip地址、郵箱、密碼規則是否合法。如果讓你使用if一類的傳統方法進行處理,你肯定會被逼瘋的。而對於絕大多數的編程語言而言,都有一個字元串處理利器————正則表達式。它可以輕鬆的讓字元串和規則匹配上。有點這樣的意思,從前你是判斷字元串,去遍歷它,而有了正則表達式,你是在書寫一個通用性質的規則,讓字元串與規則進行匹配。正則表達式本質上就是一串蘊含了一些特殊字元規則的字元串,因此我們書寫正則表達式其實是在書寫一個字元串,只是它代表了一定的規則而已。

常見的幾種正則符號

事實上正則表達式沒有過多的知識點,只是一些技巧性的訓練,但請相信我,正則表達式是非常重要的。熟練的使用下列的正則符號會對你大有脾益。

元字元

元字元 說明
. 匹配除了換行符以外的任意字元
\w 匹配字母、數字、下劃線以及漢字
\s 匹配任意空白符
\d 匹配數字
\b 匹配單詞的開始或結束
^ 匹配字元串的開始
$ 匹配字元串的結束

1.例如匹配abc開頭的字元串

\babc 或者 ^abc

2.匹配5位數字的字元串

^\d\d\d\d\d$

重覆限定符號

有了元字元就可以寫不少的正則表達式了,但細心的你們可能會發現:別人寫的正則簡潔明瞭,如果你只使用元字元進行正則表達式的書寫,既不美觀也不實用,因此我們使用重覆限定符進行重覆數據的處理,下麵我們來看一些限定符:

字元 說明
* 重覆0次或多次
+ 重覆一次或一次以上
? 重覆0次或一次
{n} 重覆n次
{n,} 重覆n次或更多次
{n,m} 重覆n到m次

現在我們就能書寫相當美觀的正則表達式了,例如:
1.匹配7位數字的電話號碼

^\d{7}$ 

2.匹配138開頭的手機號

^138\d{8}

3.匹配a開頭,若幹個b結尾的字元串

^ab*$

分組

現在我們已經學會以一點關於書寫正則表達式的方法,不過,我們現在無論是匹配還是重覆都是針對單個字元進行操作,假如說我希望匹配一個以ab為迴圈的重覆字元串應該如何去處理呢?

答案很簡單,就是分組,分組我們通常使用()進行分組,例如匹配以ab為迴圈的字元串為:

^(ab)*

轉義字元

有的時候,我們需要匹配的字元串中本身就含有正則表達式中的關鍵字元,我們則需要轉義,例如我們需要匹配(ab)為迴圈的字元串:

^(\(ab\))*

反斜杠\就是我們的轉義字元。不過對於C#中,字元串含有反斜杠會自動轉義,為了避免這種情況,我們需要在字元串之前加上@或者將將轉義字元轉義,也就是\兩個斜杠

條件或

有的時候,我們需要匹配的字元串可能是ab開頭也有可能是cd開頭,這個時候我們就使用條件語句處理,例如:

^(ab|cd)*

用邏輯或“|”進行處理。

區間匹配

有的時候,我們有可能是需要匹配比如說138-150之間所有數字開頭的字元串,或者說A-F按字母表順序內的字母開頭,我們可以這樣

^[138-150]*
^[A-F]*

反義

之前我們談論的都是字元串中含有什麼什麼,現在我們可能需要匹配到字元串中不含有的字元,那麼我們就需要使用反義,如下表

元字元 說明
\W 匹配不是字母、數字、下劃線以及漢字
\S 匹配不是空白符
\D 匹配不是數字
\B 匹配不是單詞的開始或結束
[^x] 匹配出了x以外的任意字元

貪婪模式與懶惰模式

貪婪

貪婪是當正則表達式中包含能接受重覆的限定符時,通常的行為是(在使整個表達式能得到匹配的前提下)匹配儘可能多的字元,這匹配方式叫做貪婪匹配。特性:一次性讀入整個字元串進行匹配,每當不匹配就捨棄最右邊一個字元,繼續匹配,依次匹配和捨棄(這種匹配-捨棄的方式也叫做回溯),直到匹配成功或者把整個字元串捨棄完為止,因此它是一種最大化的數據返回,能多不會少。

事實上我們之前所談論的重覆限定符就是一種貪婪量詞
舉個例子例如我們需要匹配由2-5個數字組成的字元串,假設有這樣一串數字51354 8454 1 568,使用^\d{2,5}進行匹配的結果是51354 8454 568,事實上對於這些而言,匹配兩個就已經滿足了,例如51已經滿足該正則式,但是在貪婪匹配中,它會儘可能的多匹配,將整個字元串輸出。

如果多個貪婪量詞疊加在一起,如果字元串能滿足他們各自最大程度的匹配時,就互不幹擾,但如果不能滿足時,會根據深度優先原則,也就是從左到右的每一個貪婪量詞,優先最大數量的滿足,剩餘再分配下一個量詞匹配。

懶惰

懶惰匹配:當正則表達式中包含能接受重覆的限定符時,通常的行為是(在使整個表達式能得到匹配的前提下)匹配儘可能少的字元,這匹配方式叫做懶惰匹配。特性:從左到右,從字元串的最左邊開始匹配,每次試圖不讀入字元匹配,匹配成功,則完成匹配,否則讀入一個字元再匹配,依此迴圈(讀入字元、匹配)直到匹配成功或者把字元串的字元匹配完為止。

使用懶惰量詞就是在貪婪量詞後面中加?,對於之前的例子,他會匹配成51 35 84 54 56

拓展

零寬斷言

零寬斷言用於查找在某些內容(但並不包括這些內容)之前或之後的東西,也就是說它們像\b,^,$那樣用於指定一個位置,這個位置應該滿足一定的條件(即斷言),因此它們也被稱為零寬斷言。最好還是拿例子來說明吧: 斷言用來聲明一個應該為真的事實。正則表達式中只有當斷言為真時才會繼續進行匹配。

非常抽象而且籠統,對吧,事實上我也那麼覺得,以上內容來自百度百科,因為我實在是很難解釋這個東西,你可以理解為匹配不含正則結果的內容吧。

正向先行斷言(正前瞻)

正前瞻的語法為:

//pattern為正則式
(?=pattern)

它用於匹配pattern表達式之前的內容,並不返回本身。感覺還是很奇怪對吧,舉一個例子:今年我市GDP為5600億元。假設你要將這句話中的5600取出來,你使用正前瞻的方式應該怎麼做?

\d+(?=億元)

正向後行斷言(正後顧):

正後顧的語法為:

//pattern為正則式
(?<=pattern)

與正前瞻相反,他是返回pattern之後的內容,如果繼續實現之前的內容,那麼表達式就會變成

(<=今年我市GDP為)\d+

負向先行斷言(負前瞻)

負前瞻的語法為:

//pattern為正則式
(?!pattern)

匹配非pattern表達式的前面內容,不返回本身。還是舉之前的例子,我要找到5600億元之前的字母,那麼可以是

[A-Z]+(?!5600億元)

負向後行斷言(負後顧)

這個想必我不需要進行講解各位也應當能思考出如何書寫及使用了,他的語法類似的是:

//pattern為正則式
(?<!pattern)

作用當然是匹配非pattern之後的內容。

我在這裡就舉這幾個例子,還有一些很好的使用手冊你可以參考Microsoft Documents

捕獲與非捕獲

捕獲你可以理解為將表達式按組分配,例如你匹配一個電話010-8511561,010是區號,我們有可能利用正則式將它單獨取出來。

數字編號捕獲組

語法就是我們之前的分組,但是匹配這個電話號碼的時候,他的表達式如果是

((\d{3})-(\d{7}))

那麼他會分為三組,第一組是完整的電話,第二組是我們的區號,第三組是我們的電話號碼。

命名編號捕獲組

語法:

(?<name>exp)

這個name就是你自己自定義的,例如之前的我們可以寫成

(?<quhao>\d{3})-(?<haoma>\d{7})

這樣我們可以通過名稱進行訪問組內數據,具體的使用我會在後面進行講解。

非捕獲組

同之前相反,它用於表示不需要分組的數據

(?:exp)

例如我們不需要區號,那麼正則式就變成了

(?:\d{3})-(\d{7})

反向引用

捕獲會返回一個捕獲組,這個分組是保存在記憶體中,不僅可以在正則表達式外部通過程式進行引用,也可以在正則表達式內部進行引用,這種引用方式就是反向引用。

同樣的,根據捕獲組命名規則,反向引用也有兩種
1- 數字反向引用:\k或\number
2- 命名反向引用:\k或'name'

反向引用通常和捕獲組是一同使用的,它的作用主要是用來查找一些重覆的內容或者做替換指定字元。比如要查找一串字母"aabbbbgbddesddfiid"里成對的字母。

我們捋捋思路:

  • 首先我們要有一個匹配字母的捕獲組:(\w)
  • 然後(\w)\1

這樣就可以了,\1代表的是1分組,這樣就是一個匹配成對字母的正則式了。

如何使用正則表達式

位於 System.Text.RegularExpressions 空間下的 Regex 可以對正則表達式進行處理。

Match

這是匹配結果的對象,內含這幾個常用的屬性及方法

  • Value:匹配值
  • Groups:分組
  • Index:匹配值的第一個字元的索引
  • Success:是否符合正則式
  • NextMatch:下一個符合的匹配值

    Regex.Matches

    匹配多個符合的結果,返回一個MatchCollection數組,使用foreach並轉換成Match對象進行訪問.
  • IsMatch:是否符合正則式
  • Replace:替換匹配上正則式的字元串
  • Split:按匹配上的字元串進行分割
  • Match:返回第一個符合正則式的字元串
  • Matches:返回所有符合的字元串

Reference

老劉

如果我的文章幫助了您,請您在github.NETCoreGuide項目幫我點一個star,在博客園中點一個關註和推薦。

Github

BiliBili主頁

WarrenRyan'sBlog

博客園


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 11.38 css三大特性 11.39 字體屬性 1、font-weight:文字粗細(字重) 2、font-style:文字風格 3、font-size:文字大小 4、font-family:文字字體 註意: 1、設置的字體必須是用戶電腦里已經安裝的字體,瀏覽器會使用它可識別的第一個值。 2、如果 ...
  • 今年在面試的時候被問到單點登錄的知識,當時支支吾吾不知該如何作答,於是面試失敗。回到住所便開始上網查找資料,但苦於難於找到詳盡的demo,總是無法入門。又由於我正在學習瞭解asp.net core,裡面正好有登錄驗證方面的東西,待我探究之,以求入門。 1:新建asp.net core 項目,將身份驗 ...
  • 代碼: <RichTextBox CaretBrush="#fff" Background="Transparent" BorderThickness="0"> <FlowDocument FontSize="16" Foreground="#fff"> <Paragraph LineHeight= ...
  • 8月7日微軟在官方博客發起了一次關於.NET桌面和移動開發的調查問卷,直到今天看博客才知道。這次調查的重點是關於.NET桌面開發技術的跨平臺,於是我喜大普奔,奔走相告,希望有這方面需求的朋友們都能去參與這份調查問卷,如果將來微軟推出了跨平臺的.NET桌面框架,這裡邊也有我們的一份力量! Callin ...
  • 3.7 集合 ( set ) 3.7.1 集合的表示 ​ 集合存的數據都是不可變類型(可哈希值)等於字典的key值 3.7.2 集合的常用功能 add 添加 同列表的append discard 刪除 pop 隨機刪 remove 刪除指定的值 uptate 批量添加 3.7.3關係運算 交集 in ...
  • 一、NPOI組件導入 右鍵項目菜單,“管理NuGet程式包” 直接搜索“NPOI”即會出現列表,下載第一個進行安裝即可 安裝完成後項目引用會出現以下幾項 二、基礎使用 添加引用 Excel操作開始 文件導出 三、樣式及單元格操作 單元格合併 文件的詳細信息設置 四、Excel文件讀取 讀取完畢之後, ...
  • 主要用於批量的sql操作:第一步創建中間表,第二步多次寫數據到中間表,第三步 提交執行 創建三步遞交的存儲過程: CREATE PROC usp_testsbdj@bz int=0,@name VARCHAR(100)=''AS IF(@bz=1)BEGIN CREATE TABLE ##temp( ...
  • GridView中使用最多的一個是BoundField,還有一個是TemplateField 這兩個各有其特點,BoundField的話比較簡單,設置好DataField、HeaderText等就okay了。但是有時候用TemplateField 的話,交互性就更多了。 這次的項目中,對方要我們做二 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...