C# 正則進階

来源:https://www.cnblogs.com/gl1573/archive/2020/02/12/12298529.html
-Advertisement-
Play Games

假設一個密碼要求長度大於 8 位,至少包含一個數字、一個小寫字母、一個大寫字母,如果用一條正則驗證? ...


.NET 中的正則表達式是基於 Perl 5 的正則表達式。

超時

從 .NET Framework 4.5 開始,正則表達式支持在匹配操作中指定超時時間。如果匹配超時,就會拋出 RegexMatchTimeoutException

所有方法都增加了帶超時時間參數的重載:

public static Match Match(string input, string pattern, RegexOptions options, TimeSpan matchTimeout);

public static MatchCollection Matches(string input, string pattern, RegexOptions options, TimeSpan matchTimeout);

public static string Replace(string input, string pattern, string replacement, RegexOptions options, TimeSpan matchTimeout);

public static string[] Split(string input, string pattern, RegexOptions options, TimeSpan matchTimeout);

如果應用程式需要處理任意的正則表達式(例如在高級搜索對話框中)則務必使用該參數以防止一些惡意的正則表達式導致無限計算。

編譯正則表達式

RegexOptions.Compiled 選項將會使 Regex 實例通過輕量級的代碼生成器動態地構建並編譯針對特定正則表達式的代碼,提高匹配速度。

模式修正符

模式修正符不僅可以打開,還可以關閉。如下示例,先打開忽略大小寫,再關閉忽略大小寫,所以匹配結果是 Aa

Regex.Match("AAAa", "(?i)a(?-i)a").Value;    // Aa

零寬斷言

現在要寫一個用於驗證密碼是否符合要求的正則表達式,要求是至少包含一個數字。

這個很簡單,如下就可以了

Regex.IsMatch("12345678", "\d");

現在加一個條件,長度要大於 6 位。似乎用一個正則無法實現。

其實是可以的,用零寬斷言中的 正向先行斷言 就可以了。

正向先行斷言 (?=exp),一般用來匹配 exp 之前的內容。例如下麵個例子,要取出姓名,需要匹配 之前的內容。

Regex.Match("姓名張三,男,30 歲", "(?<=姓名).*?(?=,)").Value;  // 張三

其實,正確的理解是:正向先行斷言,匹配成功之後,會退回起始位置,然後繼續之後的匹配。

這裡最重要的一點是,匹配成功以後退回起始位置,所以,對它正確的理解是,一個前向條件判斷。

那麼上面的密碼至少包含一個數字,且長度大於 6 就好實現了:

Regex.IsMatch("abcde6", @"(?=.*\d).{6,}");

我們再增加一點難度,密碼要求符合如下條件:

  • 至少 8 位
  • 至少包含一個數字
  • 至少包含一個小寫字母
  • 至少包含一個大寫字母
string pattern = @"(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,}";
Regex.IsMatch("12345678", pattern);  // false
Regex.IsMatch("1234567a", pattern);  // false
Regex.IsMatch("123456aA", pattern);  // true

分割字元串

分割字元串分隔符不會包含在結果中,若要將分隔符包含在結果中,則可以將表達式包含在正前向條件中。

foreach (string s in Regex.Split("oneTwoThree", "(?=[A-Z])"))
    Console.WriteLine(s);
    
// one
// Two
// Three

分組

正則表達式中可以通過 \n 語法來引用索引為 n 的分組。

var m = Regex.Matches("pop pope peep", @"\b(\w)\w+\1\b");

// pop
// peep

命名捕獲分組語法:
(?'組名'表達式)(?<組名>表達式)

引用命名分組語法:
\k'組名'\k<組名>

替換並分割文本

替換字元串可以通過 $0 作為替代結構訪問原始的匹配。$1$2 訪問任意捕獲的分組。對於命名分組,可以通過 ${name} 的方式進行訪問。

給所有數字加上 <>:

Console.WriteLine(Regex.Replace("1 + 11 = 12", @"\d+", @"<$0>"));
// <1> + <11> = <12>

MatchEvaluator 委托

Replace 方法有一個重載,使用 MatchEvaluator 委托作為參數,替代 replacement。該委托將對每個匹配執行一次,並使用其返回結果替換原字元串中的值。

MatchEvaluator 委托定義:

public delegate string MatchEvaluator(Match match);

示例:

Console.WriteLine(Regex.Replace("1 + 11 = 12", @"\d+", m => (int.Parse(m.Value) * 10).ToString()));

// 10 + 110 = 120

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

-Advertisement-
Play Games
更多相關文章
  • 在前面幾篇文章的例子中也可以看到mybatis中輸入映射和輸出映射的身影,但是沒有系統的總結一下,這篇博客主要對這兩個東東做一個總結。我們知道mybatis中輸入映射和輸出映射可以是基本數據類型、hashmap或者pojo的包裝類型,這裡主要來總結一下pojo包裝類型的使用,因為這個在開發中比較常用 ...
  • 4.1 數組的相關概念和名詞(瞭解) 1、數組(array): 一組具有相同數據類型的數據的按照一定順序排列的集合。 把有限的幾個相同類型的變數使用一個名稱來進行統一管理。 2、數組名: (1)這個數組名,代表的是一組數 (2)這個數組名中存儲的整個數組的“首地址” 3、下標(index): 我們使 ...
  • 由於Api的介面需要返回多語言,因此參考了網上很多篇文章,,有些文章寫的太過於理論,看起來比較費勁,今天下午搞了一個下午,總結了一下經驗,, 做這個功能時,主要參考了兩篇文章: https://blog.johnwu.cc/article/ironman-day21-asp-net-core-loc ...
  • 在 寫xaml的使用遇到了一些特殊字元,這裡記錄一下特殊字元轉義。 這些特殊字元遵循用於編碼的萬維網聯合會(W3C) XML 標準。 下表顯示這組特殊字元的編碼語法: 字元語法描述 < &lt; 小於符號。 > &gt; 大於符號。 & &amp; & 符號。 " &quot; 雙引號。 參見: h ...
  • 樣式提供了重用一組屬性設置的實用方法。它們為幫助構建一致的、組織良好的界面邁出了重要的第一步——但是它們也是有許多限制。 問題是在典型的應用程式中,屬性設置僅是用戶界面基礎結構的一小部分。甚至最基本的程式通常也需要大量的用戶界面代碼,這些代碼與應用程式的功能無關。在許多程式中,用於用戶界面任務的代碼 ...
  • static void Main(string[] args) { InsertionSortDemo(); Console.ReadLine(); } static void InsertionSortDemo() { Random rnd = new Random(); int[] arr = ...
  • 長鏈接發送request/response時, 絕大部分包都是小包, 而每個小包都要消耗一個IP包, 成本大約是20-30us, 普通千兆網卡的pps大約是60Wpps, 所以想要提高長鏈接密集IO的應用性能, 需要做包的合併, 也稱為了scatter/gather io或者vector io. 在 ...
  • 如何重構我們以前寫的垃圾代碼——觀察者模式 首先來看下 GoF 對觀察者模式的定義: 多個對象間存在一對多關係,當一個對象發生改變時,把這種改變通知給其他多個對象,從而影響其他對象的行為 就是說當一個對象要發生變化時,要通知其他多個對象同時要發生相應的變化的行為。 從這句定義上來看,重點在於兩個“對 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...