目錄
valid
首頁 後端開發 C#.Net教程 C#正規表示式元字元詳解

C#正規表示式元字元詳解

Nov 29, 2019 pm 05:36 PM
c# 正規表示式

本文整理C#正規表示式的元字符,正規表示式是由字符構成的表達式,每個字符代表一個規則,表達式中的字符分為兩種類型:普通字符和元字符。普通字符是指字面含義不變的字符,按照完全匹配的方式匹配文本,而元字符具有特殊的含義,代表一類字符。

C#正規表示式元字元詳解

把文字看作是字元流,每個字元放在一個位置上,例如,正規表示式“Room\d\d\d”,前面四個字符Room是普通字符,後面的字符\是轉義字符,和後面的字符d組成一個元字符\d,表示該位置上有任意一個數字。

C#正規表示式元字元詳解

用正規表示式的語言來描述是:正規表示式「Room\d\d\d」共捕獲7個字符,表示“以Room開頭、以三個數字結尾」的一類字串,我們把這一類字串稱作一個模式(Pattern),也稱作是一個正則。

一、轉義字符

轉義字符是\,把普通字符轉義為具有特殊意義的元字符,常用的轉義字符有:

\t:水平製表符

\v:垂直製表符

\r:回車

##\n:換行

\\:表示字元\,也就說,把轉義字元\ 轉義為普通的字元\

\":表示字元",在C#中,雙引號用於定義字串,字串包含的雙引號用\" 來表示

二、字元類別##在進行正規比對時,把輸入文字看作是有順序的字符流,字符類元字符匹配的對像是字符,並會捕獲字符。所謂捕獲字符是指,一個元字符捕獲的字符,不會被其他元字符匹配,後續的元字元只能從剩餘的文字重新匹配。

常用的字元類別元字元:

[ char_group]:匹配字元群組中的任一個字元

[^char_group]:符合除字符組之外的任意一個字符

[first-last]:匹配從first到last的字符範圍中的任意一個字符,字符範圍包括first和last.

.   :通配符,符合除\n之外的任一個字元

\w:符合任何一個單字(word)字符,單字字元通常是指A-Z、a-z和0 -9

\W:匹配任一個非單字字符,是指除A-Z、a-z和0-9之外的字符

\s:匹配任一個空白字符

\S:符合任一非空白字元

\d:符合任一數字字元

\D:符合任一非數字字元

注意,轉義字符也屬於字符類元字符,在進行正則匹配時,也會捕獲字符。

三、定位符

定位符匹配(或捕獲)的物件是位置,它根據字符的位置來判斷模式匹配是否成功,定位符不會捕獲字符,是零寬的(寬度為0),常用的定位符有:

# ^:預設情況下,符合字串的起始位置;在多行模式下,符合每行的起始位置;

#$:預設情況下,符合字串的結束位置,或字串結尾的\n之前的位置;在多行模式下,匹配每行結束之前的位置,或每行結尾的\n之前的位置。

\A:匹配字串的開始位置;

\Z:符合字串的結束位置,或字串結尾的\n之前的位置;

\z:匹配字串的結束位置;

\G:匹配上一個匹配結束的位置;

\b:匹配一個單字的開始或結束的位置;

\B:匹配一個單字的中間位置;

C#正規表示式元字元詳解

#四、量詞、貪婪和懶惰

量詞是指限定前面的一個正規出現的次數,量詞分為兩種模式:貪婪模式和懶惰模式,貪婪模式是指匹配盡可能多的字符,而懶惰模式是指匹配盡可能少的字符。預設情況下,量詞處於貪婪模式,在量詞的後面加上?來啟用懶惰模式。

*:出現0次或多次

:出現1次或多次

?:出現0次或1次

# {n}:出現n次

{n,}:出現至少n次

{n,m}:出現n到m次

##注意,出現多次是指前面的元字元出現多次,例如,\d{2} 等價於\d\d,只是出現兩個數字,並不要求兩個數字是相同的。要表示相同的兩個數字,必須使用分組來實現。

C#正規表示式元字元詳解五、分組與擷取字元

#

()  括號不僅決定表達式的範圍,還要建立分組,()內的表達式就是一個分組,引用分組表示兩個分組匹配的文字是完全相同的。定義一個分組的基本語法:

(pattern)
登入後複製

該類型的分組會捕獲字符,所謂捕獲字符是指:一個元字符捕獲的字符,不會被其他元字符匹配,後續的元字符只能從剩下的文本中重新匹配。

1、分組編號和命名

預設情況下,每個分組自動分配一個組號,規則是:從左向右,按分組左括號的出現順序進行編號,第一個分組的組號為1,第二個為2,以此類推。也可以為分組指定名稱,該分組稱作命名分組,命名分組也會被自動編號,編號從1開始,逐個加1,為分組指定名稱的語法是:

(?< name > pattern)
登入後複製

通常來說,分組分為命名分組和編號分組,引用分組的方式有:

透過分組名稱來引用分組:\k

透過分組編號來引用分組:\number

注意,分組只能後向引用,也就是說,從正規表示式文字的左邊開始,分組必須先定義,然後才能在定義之後面引用。

在正規表示式裡引用分組的語法為“\number”,例如“\1”代表與分組1 匹配的子字串,“\2”代表與分組2 匹配的字符串,以此類推。

例如,對於"<(.*?)>.*?" 可以匹配

valid

,在引用分組時,分組對應的文本是完全相同的。

2、分組建構器

分組建構方法如下:

(pattern):捕獲匹配的子表達式,並為分組分配一個組號

(?< name > pattern):把匹配的子表達式捕獲到命名的分組中

(?:pattern):非捕獲的分組,並未分組分配一組號

(?> pattern):貪婪分組

3、貪婪分組

貪婪分組也稱為非回溯分組,該分組禁用了回溯,正規表示式引擎將盡可能匹配輸入文字中的字元。如果無法進行進一步的匹配,則不會回溯嘗試進行其他模式匹配。

(?> pattern )
登入後複製

4、二選一

| 的意思是或,配對兩者中的任一個,注意,|把左右兩邊的表達式分為兩部分。

pattern1 | pattern2

六,零寬斷言

零寬是指寬度為0,符合的是位置,所以符合的子字串不會出現在配對結果中,而斷言是指判斷的結果,只有斷言為真,才算匹配成功。

對於定位符,可以匹配一句話的開始、結束(^ $)或匹配一個單字的開始、結束(\b),這些元字符只匹配一個位置,指定這個位置滿足一定的條件,而不是匹配某些字符,因此,它們被成為零寬斷言。所謂零寬,指的是它們不與任何字符相匹配,而匹配一個位置;所謂斷言,指的是一個判斷,正則表達式中只有當斷言為真時才會繼續進行匹配。零寬斷言可以精確的匹配一個位置,而不僅僅是簡單的指定句子或單字。

正規表示式把文字看作從左向右的字元流,向右叫做後向(Look behind),向左叫做前向(Look ahead)。對於正規表示式,只有當匹配到指定的模式(Pattern)時,斷言為True,叫做肯定式,把不匹配模式為True,叫做否定式。

依照符合的方向和配對的定性,把零寬斷言分成四種:

(?= pattern):前向、肯定斷言

#(?! pattern):前向、否定斷言

(?<= pattern):後向、肯定斷言

(?

 1、前向肯定斷言

前向肯定斷言定義一個模式必須存在於文字的結尾(或右邊),但是該模式相符的子字串不會出現在匹配的結果中,前向斷言通常出現在正則表達式的右側,表示文本的右側必須滿足特定的模式:

 (?= subexpression )
登入後複製

使用前向肯定斷言可以定一個模糊匹配,後綴必須包含特定的字元:

\b\w+(?=\sis\b)
登入後複製

對正規表示式進行分析:

\b:表示單字的邊界

 \w :表示單字至少出現一次

(?=\sis\b):前向肯定斷言,\s 表示一個空白字符, is 是普通字符,完全匹配,\b 是單字的邊界。

從分析中,可以得出,符合該正規表示式的文字中必須包含 is 單詞,is是一個單獨的單詞,不是某一個單字的一個部分。舉個例子

Sunday is a weekend day 匹配该正则,匹配的值是Sunday,而The island has beautiful birds 不匹配该正则。

2、后向肯定断言

后向肯定断言定义一个模式必须存在于文本的开始(或左侧),但是该模式匹配的子串不会出现在匹配的结果中,后向断言通常出现在正则表达式的左侧,表示文本的左侧必须满足特定的模式:

(?<= subexpression )
登入後複製

使用后向肯定断言可以定一个模糊匹配,前缀必须包含特定的字符:

(?<=\b20)\d{2}\b
登入後複製

对正则表达式进行分析:

(?<=\b20):后向断言,\b表示单词的开始,20是普通字符

\d{2}:表示两个数字,数字不要求相同

\b:单词的边界

该正则表达式匹配的文本具备的模式是:文本以20开头、以两个数字结尾。

七,用正则从格式化的文本中扣值

有如下的JSON格式的文本,从文本中扣出字段(CustomerId、CustomerName、CustomerIdSource和CustomerType)的值:

{"CustomerDetails":"[{\"CustomerId\":\"57512f19\",\"CustomerName\":\"cust xyz\",\"CustomerIdSource\":\"AadTenantId\",\"CustomerType\":\"Enterprise\"}]"}
登入後複製

注意,该文本转换为C#中的字符时,需要对双引号和转义字符进行转义。由于这四个字段提取规则相同,可以写一个通用的模式来提取:

public static string GetNestedItem(string txt, string key)
{
    string pat = string.Format("(?<=\\\\\"{0}\\\\\":\\\\\").*?(?=\\\\\")", key);
    return Regex.Match(txt, pat, RegexOptions.IgnoreCase).Value;
}
登入後複製

正则表达式得解析:

(?

.*?:懒惰模式,匹配尽可能少的文本

(?=\\\\\"):前向断言,用于匹配字段值得双引号

本文来自 C#.Net教程 栏目,欢迎学习!  

以上是C#正規表示式元字元詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

<🎜>:泡泡膠模擬器無窮大 - 如何獲取和使用皇家鑰匙
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系統,解釋
4 週前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆樹的耳語 - 如何解鎖抓鉤
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1670
14
CakePHP 教程
1428
52
Laravel 教程
1329
25
PHP教程
1273
29
C# 教程
1256
24
使用 C# 的活動目錄 使用 C# 的活動目錄 Sep 03, 2024 pm 03:33 PM

使用 C# 的 Active Directory 指南。在這裡,我們討論 Active Directory 在 C# 中的介紹和工作原理以及語法和範例。

C# 中的隨機數產生器 C# 中的隨機數產生器 Sep 03, 2024 pm 03:34 PM

C# 隨機數產生器指南。在這裡,我們討論隨機數產生器的工作原理、偽隨機數和安全數的概念。

C# 資料網格視圖 C# 資料網格視圖 Sep 03, 2024 pm 03:32 PM

C# 資料網格視圖指南。在這裡,我們討論如何從 SQL 資料庫或 Excel 檔案載入和匯出資料網格視圖的範例。

C# 中的階乘 C# 中的階乘 Sep 03, 2024 pm 03:34 PM

C# 階乘指南。這裡我們討論 C# 中階乘的介紹以及不同的範例和程式碼實作。

c#多線程和異步的區別 c#多線程和異步的區別 Apr 03, 2025 pm 02:57 PM

多線程和異步的區別在於,多線程同時執行多個線程,而異步在不阻塞當前線程的情況下執行操作。多線程用於計算密集型任務,而異步用於用戶交互操作。多線程的優勢是提高計算性能,異步的優勢是不阻塞 UI 線程。選擇多線程還是異步取決於任務性質:計算密集型任務使用多線程,與外部資源交互且需要保持 UI 響應的任務使用異步。

C# 中的模式 C# 中的模式 Sep 03, 2024 pm 03:33 PM

C# 模式指南。在這裡,我們討論 C# 中模式的介紹和前 3 種類型,以及其範例和程式碼實作。

C# 中的質數 C# 中的質數 Sep 03, 2024 pm 03:35 PM

C# 質數指南。這裡我們討論c#中素數的介紹和範例以及程式碼實作。

xml怎麼改格式 xml怎麼改格式 Apr 03, 2025 am 08:42 AM

可以採用多種方法修改 XML 格式:使用文本編輯器(如 Notepad )進行手工編輯;使用在線或桌面 XML 格式化工具(如 XMLbeautifier)進行自動格式化;使用 XML 轉換工具(如 XSLT)定義轉換規則;或者使用編程語言(如 Python)進行解析和操作。修改時需謹慎,並備份原始文件。

See all articles