本文整理C#正則表達(dá)式的元字符,正則表達(dá)式是由字符構(gòu)成的表達(dá)式,每個(gè)字符代表一個(gè)規(guī)則,表達(dá)式中的字符分為兩種類型:普通字符和元字符。普通字符是指字面含義不變的字符,按照完全匹配的方式匹配文本,而元字符具有特殊的含義,代表一類字符。
創(chuàng)新互聯(lián)公司網(wǎng)站建設(shè)提供從項(xiàng)目策劃、軟件開(kāi)發(fā),軟件安全維護(hù)、網(wǎng)站優(yōu)化(SEO)、網(wǎng)站分析、效果評(píng)估等整套的建站服務(wù),主營(yíng)業(yè)務(wù)為網(wǎng)站設(shè)計(jì)、網(wǎng)站制作,成都app軟件開(kāi)發(fā)公司以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠(chéng)的服務(wù)。創(chuàng)新互聯(lián)公司深信只要達(dá)到每一位用戶的要求,就會(huì)得到認(rèn)可,從而選擇與我們長(zhǎng)期合作。這樣,我們也可以走得更遠(yuǎn)!把文本看作是字符流,每個(gè)字符放在一個(gè)位置上,例如,正則表達(dá)式 “Room\d\d\d”,前面四個(gè)字符Room是普通字符,后面的字符\是轉(zhuǎn)義字符,和后面的字符d組成一個(gè)元字符\d,表示該位置上有任意一個(gè)數(shù)字。
用正則表達(dá)式的語(yǔ)言來(lái)描述是:正則表達(dá)式 “Room\d\d\d”共捕獲7個(gè)字符,表示“以Room開(kāi)頭、以三個(gè)數(shù)字結(jié)尾”的一類字符串,我們把這一類字符串稱作一個(gè)模式(Pattern),也稱作是一個(gè)正則。
一、轉(zhuǎn)義字符
轉(zhuǎn)義字符是\,把普通字符轉(zhuǎn)義為具有特殊含義的元字符,常用的轉(zhuǎn)義字符有:
\t:水平制表符
\v:垂直制表符
\r:回車
\n:換行
\\:表示字符 \,也就說(shuō),把轉(zhuǎn)義字符 \ 轉(zhuǎn)義為普通的字符 \
\":表示字符 ",在C#中,雙引號(hào)用于定義字符串,字符串包含的雙引號(hào)用 \" 來(lái)表示
二、字符類
在進(jìn)行正則匹配時(shí),把輸入文本看作是有順序的字符流,字符類元字符匹配的對(duì)象是字符,并會(huì)捕獲字符。所謂捕獲字符是指,一個(gè)元字符捕獲的字符,不會(huì)被其他元字符匹配,后續(xù)的元字符只能從剩下的文本中重新匹配。
常用的字符類元字符:
[ char_group]:匹配字符組中的任意一個(gè)字符
[^char_group]:匹配除字符組之外的任意一個(gè)字符
[first-last]:匹配從first到last的字符范圍中的任意一個(gè)字符,字符范圍包括first和last。
. :通配符,匹配除\n之外的任意一個(gè)字符
\w:匹配任意一個(gè)單詞(word)字符,單詞字符通常是指A-Z、a-z和0-9
\W:匹配任意一個(gè)非單詞字符,是指除A-Z、a-z和0-9之外的字符
\s:匹配任意一個(gè)空白字符
\S:匹配任意一個(gè)非空白字符
\d:匹配任意一個(gè)數(shù)字字符
\D:匹配任意一個(gè)非數(shù)字字符
注意,轉(zhuǎn)義字符也屬于字符類元字符,在進(jìn)行正則匹配時(shí),也會(huì)捕獲字符。
三、定位符
定位符匹配(或捕獲)的對(duì)象是位置,它根據(jù)字符的位置來(lái)判斷模式匹配是否成功,定位符不會(huì)捕獲字符,是零寬的(寬度為0),常用的定位符有:
^:默認(rèn)情況下,匹配字符串的開(kāi)始位置;在多行模式下,匹配每行的開(kāi)始位置;
$:默認(rèn)情況下,匹配字符串的結(jié)束位置,或 字符串結(jié)尾的\n之前的位置;在多行模式下,匹配每行結(jié)束之前的位置,或者每行結(jié)尾的\n之前的位置。
\A:匹配字符串的開(kāi)始位置;
\Z:匹配字符串的結(jié)束位置,或 字符串結(jié)尾的\n之前的位置;
\z:匹配字符串的結(jié)束位置;
\G:匹配上一個(gè)匹配結(jié)束的位置;
\b:匹配一個(gè)單詞的開(kāi)始或結(jié)束的位置;
\B:匹配一個(gè)單詞的中間位置;
四、量詞、貪婪和懶惰
量詞是指限定前面的一個(gè)正則出現(xiàn)的次數(shù),量詞分為兩種模式:貪婪模式和懶惰模式,貪婪模式是指匹配盡可能多的字符,而懶惰模式是指匹配盡可能少的字符。默認(rèn)情況下,量詞處于貪婪模式,在量詞的后面加上?來(lái)啟用懶惰模式。
*:出現(xiàn)0次或多次
+:出現(xiàn)1次或多次
?:出現(xiàn)0次或1次
{n}:出現(xiàn)n次
{n,}:出現(xiàn)至少n次
{n,m}:出現(xiàn)n到m次
注意,出現(xiàn)多次是指前面的元字符出現(xiàn)多次,例如,\d{2} 等價(jià)于 \d\d,只是出現(xiàn)兩個(gè)數(shù)字,并不要求兩個(gè)數(shù)字是相同的。要表示相同的兩個(gè)數(shù)字,必須使用分組來(lái)實(shí)現(xiàn)。
五、分組和捕獲字符
() 括號(hào)不僅確定表達(dá)式的范圍,還創(chuàng)建分組,()內(nèi)的表達(dá)式就是一個(gè)分組,引用分組表示兩個(gè)分組匹配的文本是完全相同的。定義一個(gè)分組的基本語(yǔ)法:
(pattern)
該類型的分組會(huì)捕獲字符,所謂捕獲字符是指:一個(gè)元字符捕獲的字符,不會(huì)被其他元字符匹配,后續(xù)的元字符只能從剩下的文本中重新匹配。
1、分組編號(hào)和命名
默認(rèn)情況下,每個(gè)分組自動(dòng)分配一個(gè)組號(hào),規(guī)則是:從左向右,按分組左括號(hào)的出現(xiàn)順序進(jìn)行編號(hào),第一個(gè)分組的組號(hào)為1,第二個(gè)為2,以此類推。也可以為分組指定名稱,該分組稱作命名分組,命名分組也會(huì)被自動(dòng)編號(hào),編號(hào)從1開(kāi)始,逐個(gè)加1,為分組指定名稱的語(yǔ)法是:
(?< name > pattern)
通常來(lái)說(shuō),分組分為命名分組和編號(hào)分組,引用分組的方式有:
通過(guò)分組名稱來(lái)引用分組:\k<name>
通過(guò)分組編號(hào)來(lái)引用分組:\number
注意,分組只能后向引用,也就是說(shuō),從正則表達(dá)式文本的左邊開(kāi)始,分組必須先定義,然后才能在定義之后面引用。
在正則表達(dá)式里引用分組的語(yǔ)法為“\number”,比如“\1”代表與分組1 匹配的子串,“\2”代表與分組2 匹配的字串,以此類推。
例如,對(duì)于 "<(.*?)>.*?</\1>" 可以匹配 <h3>valid</h3>,在引用分組時(shí),分組對(duì)應(yīng)的文本是完全相同的。
2、分組構(gòu)造器
分組構(gòu)造方法如下:
(pattern):捕獲匹配的子表達(dá)式,并為分組分配一個(gè)組號(hào)
(?< name > pattern):把匹配的子表達(dá)式捕獲到命名的分組中
(?:pattern):非捕獲的分組,并未分組分配一個(gè)組號(hào)
(?> pattern):貪婪分組
3、貪婪分組
貪婪分組也稱作非回溯分組,該分組禁用了回溯,正則表達(dá)式引擎將盡可能多地匹配輸入文本中的字符。如果無(wú)法進(jìn)行進(jìn)一步的匹配,則不會(huì)回溯嘗試進(jìn)行其他模式匹配。
(?> pattern )
4、二選一
| 的意思是或,匹配兩者中的任意一個(gè),注意,|把左右兩邊的表達(dá)式分為兩部分。
pattern1 | pattern2
六,零寬斷言
零寬是指寬度為0,匹配的是位置,所以匹配的子串不會(huì)出現(xiàn)在匹配結(jié)果中,而斷言是指判斷的結(jié)果,只有斷言為真,才算匹配成功。
對(duì)于定位符,可以匹配一句話的開(kāi)始、結(jié)束(^ $)或者匹配一個(gè)單詞的開(kāi)始、結(jié)束(\b),這些元字符只匹配一個(gè)位置,指定這個(gè)位置滿足一定的條件,而不是匹配某些字符,因此,它們被成為 零寬斷言。所謂零寬,指的是它們不與任何字符相匹配,而匹配一個(gè)位置;所謂斷言,指的是一個(gè)判斷,正則表達(dá)式中只有當(dāng)斷言為真時(shí)才會(huì)繼續(xù)進(jìn)行匹配。零寬斷言可以精確的匹配一個(gè)位置,而不僅僅是簡(jiǎn)單的指定句子或者單詞。
正則表達(dá)式把文本看作從左向右的字符流,向右叫做后向(Look behind),向左叫做前向(Look ahead)。對(duì)于正則表達(dá)式,只有當(dāng)匹配到指定的模式(Pattern)時(shí),斷言為True,叫做肯定式,把不匹配模式為True,叫做否定式。
按照匹配的方向和匹配的定性,把零寬斷言分為四種類型:
(?= pattern):前向、肯定斷言
(?! pattern):前向、否定斷言
(?<= pattern):后向、肯定斷言
(?<! pattern):后向、否定斷言
1、前向肯定斷言
前向肯定斷言定義一個(gè)模式必須存在于文本的末尾(或右側(cè)),但是該模式匹配的子串不會(huì)出現(xiàn)在匹配的結(jié)果中,前向斷言通常出現(xiàn)在正則表達(dá)式的右側(cè),表示文本的右側(cè)必須滿足特定的模式:
(?= subexpression )
使用前向肯定斷言可以定一個(gè)模糊匹配,后綴必須包含特定的字符:
\b\w+(?=\sis\b)
對(duì)正則表達(dá)式進(jìn)行分析:
\b:表示單詞的邊界
\w+:表示單詞至少出現(xiàn)一次
(?=\sis\b):前向肯定斷言,\s 表示一個(gè)空白字符, is 是普通字符,完全匹配,\b 是單詞的邊界。
從分析中,可以得出,匹配該正則表達(dá)式的文本中必須包含 is 單詞,is是一個(gè)單獨(dú)的單詞,不是某一個(gè)單詞的一個(gè)部分。舉個(gè)例子
Sunday is a weekend day 匹配該正則,匹配的值是Sunday,而The island has beautiful birds 不匹配該正則。
2、后向肯定斷言
后向肯定斷言定義一個(gè)模式必須存在于文本的開(kāi)始(或左側(cè)),但是該模式匹配的子串不會(huì)出現(xiàn)在匹配的結(jié)果中,后向斷言通常出現(xiàn)在正則表達(dá)式的左側(cè),表示文本的左側(cè)必須滿足特定的模式:
(?<= subexpression )
使用后向肯定斷言可以定一個(gè)模糊匹配,前綴必須包含特定的字符:
(?<=\b20)\d{2}\b
對(duì)正則表達(dá)式進(jìn)行分析:
(?<=\b20):后向斷言,\b表示單詞的開(kāi)始,20是普通字符
\d{2}:表示兩個(gè)數(shù)字,數(shù)字不要求相同
\b:?jiǎn)卧~的邊界
該正則表達(dá)式匹配的文本具備的模式是:文本以20開(kāi)頭、以兩個(gè)數(shù)字結(jié)尾。
七,用正則從格式化的文本中扣值
有如下的JSON格式的文本,從文本中扣出字段(CustomerId、CustomerName、CustomerIdSource和CustomerType)的值:
{"CustomerDetails":"[{\"CustomerId\":\"57512f19\",\"CustomerName\":\"cust xyz\",\"CustomerIdSource\":\"AadTenantId\",\"CustomerType\":\"Enterprise\"}]"}
注意,該文本轉(zhuǎn)換為C#中的字符時(shí),需要對(duì)雙引號(hào)和轉(zhuǎn)義字符進(jìn)行轉(zhuǎn)義。由于這四個(gè)字段提取規(guī)則相同,可以寫一個(gè)通用的模式來(lái)提?。?/p>
public static string GetNestedItem(string txt, string key) { string pat = string.Format("(?<=\\\\\"{0}\\\\\":\\\\\").*?(?=\\\\\")", key); return Regex.Match(txt, pat, RegexOptions.IgnoreCase).Value; }
正則表達(dá)式得解析:
(?<=\\\\\"{0}\\\\\":\\\\\"):后向斷言,用于匹配字段名、雙引號(hào)和冒號(hào)
.*?:懶惰模式,匹配盡可能少的文本
(?=\\\\\"):前向斷言,用于匹配字段值得雙引號(hào)
以上就是C#正則表達(dá)式元字符詳解的詳細(xì)內(nèi)容,更多請(qǐng)關(guān)注創(chuàng)新互聯(lián)成都網(wǎng)站設(shè)計(jì)公司其它相關(guān)文章!
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。
分享題目:C#中正則表達(dá)式的元字符介紹-創(chuàng)新互聯(lián)
URL地址:http://jinyejixie.com/article24/dpsgje.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供自適應(yīng)網(wǎng)站、App開(kāi)發(fā)、定制網(wǎng)站、移動(dòng)網(wǎng)站建設(shè)、電子商務(wù)、品牌網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容