C# 正則表達式 學習筆記一

来源:http://www.cnblogs.com/yunxiaguo/archive/2016/06/23/5609891.html
-Advertisement-
Play Games

1. 為什麼使用正則表達式? 典型的搜索和替換操作要求您提供與預期的搜索結果匹配的確切文本。雖然這種技術對於對靜態文本執行簡單搜索和替換任務可能已經足夠了,但它缺乏靈活性,若採用這種方法搜索動態文本,即使不是不可能,至少也會變得很困難。通過使用正則表達式,可以: ※ 測試字元串內的模式。 例如,可以 ...


 

1.                為什麼使用正則表達式?

典型的搜索和替換操作要求您提供與預期的搜索結果匹配的確切文本。雖然這種技術對於對靜態文本執行簡單搜索和替換任務可能已經足夠了,但它缺乏靈活性,若採用這種方法搜索動態文本,即使不是不可能,至少也會變得很困難。通過使用正則表達式,可以:

※      測試字元串內的模式。

例如,可以測試輸入字元串,以查看字元串內是否出現電話號碼模式或信用卡號碼模式。這稱為數據驗證。

※      替換文本。

可以使用正則表達式來識別文檔中的特定文本,完全刪除該文本或者用其他文本替換它。

※      基於模式匹配從字元串中提取子字元串。

可以查找文檔內或輸入域內特定的文本。

2.                定義正則表達式的各種類別的字元、運算符和結構

※      字元轉義

轉義字元

描述

模式

匹配

\a

與報警 (bell) 符 \u0007 匹配。

\a

"Warning!" + '\u0007' 中的 "\u0007"

\b

在字元類中,與退格鍵 \u0008 匹配。

[\b]{3,}

"\b\b\b\b" 中的 "\b\b\b\b"

\t

與製表符 \u0009 匹配。

(\w+)\t

"Name\tAddr\t" 中的 "Name\t" 和 "Addr\t"

\r

與回車符 \u000D 匹配。(\r 與換行符 \n 不是等效的。)

\r\n(\w+)

"\r\Hello\nWorld." 中的 "\r\nHello"

\v

與垂直製表符 \u000B 匹配。

[\v]{2,}

"\v\v\v" 中的 "\v\v\v"

\f

與換頁符 \u000C 匹配。

[\f]{2,}

"\f\f\f" 中的 "\f\f\f"

\n

與換行符 \u000A 匹配。

\r\n(\w+)

"\r\Hello\nWorld." 中的 "\r\nHello"

\e

與轉義符 \u001B 匹配。

\e

"\x001B" 中的 "\x001B"

\ nnn

使用八進位表示形式指定一個字元(nnn 由二到三位數字組成)。

\w\040\w

"a bc d" 中的 "a b" 和 "c d"

\x nn

使用十六進位表示形式指定字元(nn 恰好由兩位數字組成)。

\w\x20\w

"a bc d" 中的 "a b" 和 "c d"

\c X \c x

匹配 X 或 x 指定的 ASCII 控制項字元,其中 X 或 x 是控制項字元的字母。

\cC

"\x0003" 中的 "\x0003" (Ctrl-C)

\u nnnn

使用十六進位表示形式匹配一個 Unicode 字元(由 nnnn 表示的四位數)。

\w\u0020\w

"a bc d" 中的 "a b" 和 "c d"

\

在後面帶有不識別的轉義字元時,與該字元匹配。

\d+[\+-x\*]\d+\d+[\+-x\*\d+

"(2+2) * 3*9" 中的 "2+2" 和 "3*9"

 

※      字元類

字元類

描述

模式

匹配

[character_group]

匹配 character_group 中的任何單個字元。 預設情況下,匹配區分大小寫。

[mn]

"mat" 中的 "m","moon" 中的 "m" 和 "n"

[^character_group]

非:與不在 character_group 中的任何單個字元匹配。 預設情況下,character_group 中的字元區分大小寫。

[^aei]

"avail" 中的 "v" 和 "l"

[ first - last ]

字元範圍:與從 first 到 last 的範圍中的任何單個字元匹配。

(\w+)\t

"Name\tAddr\t" 中的 "Name\t" 和 "Addr\t"

.

通配符:與除 \n 之外的任何單個字元匹配。 
若要匹配原意句點字元(. 或 \u002E),您必須在該字元前面加上轉義符 (\.)。

a.e

"have" 中的 "ave", "mate" 中的 "ate"

\p{ name }

與 name 指定的 Unicode 通用類別或命名塊中的任何單個字元匹配。

\p{Lu}

"City Lights" 中的 "C" 和 "L"

\P{ name }

與不在 name 指定的 Unicode 通用類別或命名塊中的任何單個字元匹配。

\P{Lu}

"City" 中的 "i"、 "t" 和 "y"

\w

與任何單詞字元匹配。(數字、字母、漢字、下劃線)

\w

"Room#1" 中的 "R"、 "o"、 "m" 和 "1"

\W

與任何非單詞字元匹配。

\W

"Room#1" 中的 "#"

\s

與任何空白字元匹配。(匹配任何不可見字元,包括空格、製表符、換頁符等等。等價於[ \f\n\r\t\v]。)

\w\s

"ID A1.3" 中的 "D "

\S

與任何非空白字元匹配。

\s\S

"int _ ctr" 中的 "  c"

\d

與任何十進位數字匹配。

\d

"4 = IV" 中的 "4"

\D

匹配不是十進位數的任意字元。

\D

"4 = IV" 中的 " "、 "="、 " "、 "I" 和 "V"

 

※      定位點

斷言

描述

模式

匹配

^

匹配必須從字元串或一行的開頭開始。

^\d{3}

"567-777-" 中的 "567"

$

匹配必須出現在字元串的末尾或出現在行或字元串末尾的 \n 之前。

-\d{4}$

"8-12-2012" 中的 "-2012"

\A

匹配必須出現在字元串的開頭。

\A\w{3}

"Code-007-" 中的 "Code"

\Z

匹配必須出現在字元串的末尾或出現在字元串末尾的\n 之前。

-\d{3}\Z

"Bond-901-007" 中的 "-007"

\z

匹配必須出現在字元串的末尾。

-\d{3}\z

"-901-333" 中的 "-333"

\G

匹配必須出現在上 一個匹配結束的地方。

\\G\(\d\)

"(1)(3)(5)[7](9)" 中的 "(1)"、 "(3)" 和 "(5)"

\b

匹配必須出現在 \w(字母數字)和 \W(非字母數字)字元之間的邊界上。(匹配一個單詞邊界,也就是指單詞和空格間的位置(即正則表達式的“匹配”有兩種概念,一種是匹配字元,一種是匹配位置,這裡的\b就是匹配位置的))

er\b

可以匹配“never”中的“er”,但不能匹配“verb”中的“er”

\B

匹配不得出現在 \b 邊界上。

\Bend\w*\b

"end sends endure lender" 中的 "ends" 和 "ender"

 

※      分組構造

分組構造

描述

模式

匹配

( subexpression )

捕獲匹配的子表達式並將其分配到一個從零開始的序號中。

(\w)\1

"deep" 中的 "ee"

(?< name >subexpression)

將匹配的子表達式捕獲到一個命名組中。

(?< double>\w)\k< double>

"deep" 中的 "ee"

(?< name1 -name2 >subexpression)

定義平衡組定義。

(((?'Open'\()[^\(\)]*)+((?'Close-Open'\))[^\(\)]*)+)*(?(Open)(?!))$

"3+2^((1-3)*(3-1))" 中的 "((1-3)*(3-1))"

(?: subexpression)

定義非捕獲組。

Write(?:Line)?

"Console.WriteLine()" 中的 "WriteLine"

(?imnsx-imnsx:subexpression)

應用或禁用 subexpression 中指定的選項。

A\d{2}(?i:\w+)\b

"A12xl A12XL a12xl" 中的 "A12xl" 和 "A12XL"

(?= subexpression)

零寬度正預測先行斷言。

\w+(?=\.)

"He is. The dog ran. The sun is out." 中的 "is"、 "ran" 和 "out"

(?! subexpression)

零寬度負預測先行斷言。

\b(?!un)\w+\b

"unsure sure unity used" 中的 "sure" 和 "used"

(?< =subexpression)

零寬度正回顧後發斷言。

(?<=19)\d{2}\b

"1851 1999 1950 1905 2003" 中的 "99"、"50"和 "05"

(?< ! subexpression)

零寬度負回顧後發斷言。

(?< !19)\d{2}\b

"end sends endure lender" 中的 "ends" 和 "ender"

(?> subexpression)

非回溯(也稱為"貪婪")子表達式。

[13579](?>A+B+)

"1ABB 3ABBC 5AB 5AC" 中的 "1ABB"、 "3ABB" 和 "5AB"

 

※      限定符

限定符

描述

模式

匹配

*

匹配上一個元素零次或多次。

\d*\.\d

".0"、 "19.9"、 "219.9"

+

匹配上一個元素一次或多次。

"be+"

"been" 中的 "bee", "bent" 中的 "be"

?

匹配上一個元素零次或一次。

"rai?n"

"ran"、 "rain"

{ n }

匹配上一個元素恰好 n 次。

",\d{3}"

"1,043.6" 中的 ",043", "9,876,543,210" 中的 ",876"、 ",543" 和 ",210"

{ n ,}

匹配上一個元素至少 n 次。

"\d{2,}"

"166"、 "29"、 "1930"

{ n , m }

匹配上一個元素至少 n 次,但不多於 m 次。

"\d{3,5}"

"166", "17668", "193024" 中的 "19302"

*?

匹配上一個元素零次或多次,但次數儘可能少。

\d*?\.\d

".0"、 "19.9"、 "219.9"

+?

匹配上一個元素一次或多次,但次數儘可能少。

"be+?"

"been" 中的 "be", "bent" 中的 "be"

??

匹配上一個元素零次或一次,但次數儘可能少。

"rai??n"

"ran"、 "rain"

{ n }?

匹配前導元素恰好 n 次。

",\d{3}?"

"1,043.6" 中的 ",043", "9,876,543,210" 中的 ",876"、 ",543" 和 ",210"

{ n ,}?

匹配上一個元素至少 n 次,但次數儘可能少。

"\d{2,}?"

"166"、 "29" 和 "1930"

{ n , m }?

匹配上一個元素的次數介於 n 和 m 之間,但次數儘可能少。

"\d{3,5}?"

"166", "17668", "193024" 中的 "193" 和 "024"

 

※      反向引用構造

反向引用構造

描述

模式

匹配

\ number

反向引用。 匹配編號子表達式的值。

(\w)\1

"seek" 中的 "ee"

\k< name >

命名反向引用。 匹配命名錶達式的值。

(?< char>\w)\k< char>

"seek" 中的 "ee"

 

※      備用構造

備用構造

描述

模式

匹配

|

匹配以豎線 (|) 字元分隔的任何一個元素。

th(e|is|at)

"this is the day. " 中的 "the" 和 "this"

(?( expression )yes | no )

如果正則表達式模式由 expression 匹配指定,則匹配 yes;否則匹配可選的no 部分。 expression 被解釋為零寬度斷言。

(?(A)A\d{2}\b|\b\d{3}\b)

"A10 C103 910" 中的 "A10" 和 "910"

(?( name )yes | no )

如果 name 或已命名或已編號的捕獲組具有匹配,則匹配 yes;否則匹配可選的 no

(?< quoted>")?(?(quoted).+?"|\S+\s)

"Dogs.jpg "Yiska playing.jpg"" 中的 Dogs.jpg 和 "Yiska playing.jpg"

 

※       

3.      Regex 類常用方法

序號

方法 & 描述

1

public bool IsMatch( string input ) 
指示 Regex 構造函數中指定的正則表達式是否在指定的輸入字元串中找到匹配項。

2

public bool IsMatch( string input, int startat ) 
指示 Regex 構造函數中指定的正則表達式是否在指定的輸入字元串中找到匹配項,從字元串中指定的開始位置開始。

3

public static bool IsMatch( string input, string pattern ) 
指示指定的正則表達式是否在指定的輸入字元串中找到匹配項。

4

public static MatchCollection Matches(string input, string pattern)
在指定的輸入字元串中搜索正則表達式的所有匹配項。

5

public string Replace( string input, string replacement ) 
在指定的輸入字元串中,把所有匹配正則表達式模式的所有匹配的字元串替換為指定的替換字元串。

6

public string[] Split( string input ) 
把輸入字元串分割為子字元串數組,根據在 Regex 構造函數中指定的正則表達式模式定義的位置進行分割。


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

-Advertisement-
Play Games
更多相關文章
  • 1. 查看目錄下有什麼文件/目錄 > ls //list列出目錄的文件信息 > ls -l 或ll //list -list以“詳細信息”查看目錄文件 > ls -a //list -all查看目錄“全部”(包括隱藏文件)文件 > ls -al //list -all list 查看目錄“全部”(包 ...
  • HAL是建立在Linux驅動之上的的程式庫,他是一個應用層,它的作用保護內部私有。有一種是位於Android層次的系統運行庫層,Linux中只保留與寄存器相互的代碼,通過HAL進行數據的傳遞。 為Android加入HAL的主要目的是: 統一硬體的調用介面。 解決GPL版權問題。 資源等特殊要求。 這 ...
  • nmon 下載:http://pan.baidu.com/s/1jICoSpo 放到linux下可以直接運行。 nmon 工具可以幫助在一個屏幕上顯示所有重要的性能優化信息,並動態地對其進行更新。 nmon 工具可以為 AIX 和 Linux 性能專家提供監視和分析性能數據的功能,其中包括: CPU ...
  • 1、查看我們的Linux(centos6.5為例)有多少我們可以使用的shell: 系統某些服務在運作過程中,會去檢查使用者能夠使用的shells,而這些shell的查詢就是由/etc/shells這個檔案。 2、當我們登入Linux系統的時候,系統就會給我一個shell來工作,而這個登錄取得的sh ...
  • Linux代碼的重用: 在頭文件中載入即可使用到原來所有的功能,還有動態方式就是一個驅動使用另一個驅動的資源。 對於像蜂鳴器這樣的實驗,它的內部文件有很多,所有要有很多的源代碼以用於妥善管理。 有多個文件的話,module-y指定所有的文件,然後將會生成一個build.sh腳本,使用sh執行,使用d ...
  • 我們知道在Linux伺服器上,可以安裝多個版本的JDK,那麼當有多個JDK時,是否可以為Tomcat這類應用程式指定對應的JDK版本呢?答案是可以,指定tomcat使用特定的JDK版本。今天正好碰到這個問題,總結一下。方便以後遇到這類問題。 1:在tomcat的catalina.sh文件中加入 ex... ...
  • 最近學習了elf文件的格式,重點關註了動態鏈接過程中的使用到的section 第一步程式在載入時,會把解釋器程式加入到.interp段。可以解決動態庫和可執行文件的載入。 一般來講程式的載入方式是懶啟動,Lazy;除非指定了LD_BIND_NOW環境變數非0,那麼在程式啟動時就會把外部符號地址全部加 ...
  • 在這個練習中,我們來學習如何把我們想要的東西寫到文件中。我們在這個練習中還是使用File類中的方法來完成寫文件的操作。 在這個練習中我們要用C#創建一個純文本文件ex11.txt 放到c盤的Exercise11目錄下。通常c盤下是沒有Exercise11目錄的,請先建立這個目錄。我們的C#程式會讓用 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...