首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C# 正則表達式經典練習題解析(七):HTML 連結解析、Email 驗證與常用模式構建

     編輯:關於C語言

前言

本文整理自《C# 網絡應用編程基礎練習題與答案(七)》,針對正則表達式核心語法進行逐字拆解,並補充實戰常用模式與效能建議。

題目一:解析 HTML 錨點標籤

正則: `]+)""?>(.+)`

逐段解析

`
片段含義
`匹配字面字串 `
`\s+`至少一個空白字元 (空格、Tab、換行)
`href`匹配字面字串 `href`
`\s*`零或多個空白字元
`=`匹配字面 `=`
`\s*`零或多個空白字元
`""?`零或一個雙引號 (`"` 在字串中轉義為 `""`)
`(`**第 1 組捕獲組開始** (URL)
`[^"" >]+`匹配**非**雙引號、非空白、非 `>` 的字元,至少一個 (URL 內容)
`)`第 1 組捕獲組結束
`""?`零或一個雙引號 (閉合引號)
`>`匹配字面 `>` (標籤屬性結束)
`(.+)`**第 2 組捕獲組** (連結文字),貪婪匹配任意字元 (除換行) 至少一個
匹配字面 `` (結束標籤)

捕獲結果範例

輸入: Example Site
Group 1 (URL): https://example.com
Group 2 (Text): Example Site

⚠️ 局限與改良

題目二:Email 格式驗證正則拆解

正則: `^([\w-]+\.)*?[\w-]+@[\w-]+\.([\w-]+\.)*?[\w]+$`

逐段解析

片段含義
`^`字串開頭錨點
`([\w-]+\.)*?`**非貪婪**匹配:`[\w-]+` (字母數字底線連字號至少一個) + `.` (點號),零或多次 (子域名如 `mail.` `sub.mail.`)
`[\w-]+`主機名/使用者名主體 (至少一個字元)
`@`字面 `@` 分隔符
`[\w-]+\.`域名主體 + 點號 (如 `gmail.`)
`([\w-]+\.)*?`非貪婪匹配次級域名 (如 `co.` `com.`)
`[\w]+`頂級域名 (至少一個字母數字底線,如 `com` `cn` `io`)
`$`字串結尾錨點

測試案例

匹配: user.name@sub.domain.com, user-name@domain.co.uk, a@b.c
不匹配: @domain.com, user@.com, user@domain, user@domain..com

💡 實戰建議

  • **RFC 5322 完整 Email 正則極其複雜** (數千字元),實務上**「簡單驗證 + 發送驗證信」**是最佳策略。
  • .NET 內建 `System.ComponentModel.DataAnnotations.EmailAddressAttribute` 驗證屬性已足夠大多數場景。
  • 若需自訂:`^[^@\s]+@[^@\s]+\.[^@\s]+$` (最簡版) 或 `^[\w-\.]+@([\w-]+\.)+[\w-]{2,}$` (常用版)。

題目三:常用模式構建速查表

需求正則說明
1) 4-8 英文字母`^[a-zA-Z]{4,8}$``{m,n}` 量詞限定長度
2) 不含字母,至少 1 字元`^[^a-zA-Z]+$``^` 否定字元類別,`+` 至少一個
3) 至少 3 位數字`^\d{3,}$` 或 `[0-9]{3,}``\d` = `[0-9]`
4) 至少 3 字元 (任意)`^.{3,}$``.` 匹配除換行外任意字元
5) 至少 3 英文字母`^[a-zA-Z]{3,}$`
6) 任意字元 (含空字串)`^.*$` 或 `^.{0,}$``*` = `{0,}`
7) 3 字母或數字 (如 123, r3a)`^[A-Za-z0-9]{3}$`精確 3 字元
8) 3 個點號`^\.{3}$`點號需轉義 `\.`
9) @ 前至少 1 字元,後至少 3 字元`^.+@.{3,}$`簡化版 Email 長度檢查
10) 必須包含左括號`\(`括號為特殊字元需轉義

正則效能與最佳實踐補充

  1. 預編譯:重複使用的 Regex 必須 `new Regex(pattern, RegexOptions.Compiled)` 或 `static readonly Regex`,避免每次解析編譯。
  2. 非貪婪 vs 貪婪:`*?` `+?` `??` `{m,n}?` 在「匹配失敗/回溯」場景大幅降低步數。
  3. 定錨點 `^ $`**:防止在長字串中無謂掃描。
  4. 避免巢狀量詞:`(a+)+`、`(.*?)+` → 災難性回溯根源。
  5. 使用 `RegexOptions.NonBacktracking` (.NET 5+):自動轉換為線性時間 DFA 引擎,徹底免疫回溯爆炸。
  6. 單元測試邊界案例**:空字串、極長字串、邊界長度、特殊字元、編碼差異。

總結

正則表達式是**字串模式匹配的利器**,但**非萬能解析器**。掌握**字元類別、量詞、捕獲組、錨點、貪婪/非貪婪**核心語法,配合**預編譯、NonBacktracking、HtmlAgilityPack 解析 HTML** 等工程化手段,才能寫出高效、可維護、不踩坑的匹配邏輯。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved