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

angryTom
發布: 2019-11-29 17:36:42
原創
2877 人瀏覽過

本文整理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中文網其他相關文章!

相關標籤:
來源:cnblogs.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!