您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關(guān)C#中的正則表達式,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
正則表達式,又稱規(guī)則表達式。(英語:Regular Expression,在代碼中常簡寫為regex、regexp或RE),計算機科學(xué)的一個概念。正則表達式通常被用來檢索、替換那些符合某個模式(規(guī)則)的文本。正則表達式是對字符串操作的一種邏輯公式,就是用事先定義好的一些特定字符、及這些特定字符的組合,組成一個“規(guī)則字符串”,這個“規(guī)則字符串”用來表達對字符串的一種過濾邏輯。
把文本看作是字符流,每個字符放在一個位置上,例如,正則表達式 “Room\d\d\d”,前面四個字符Room是普通字符,后面的字符\是轉(zhuǎn)義字符,和后面的字符d組成一個元字符\d,表示該位置上有任意一個數(shù)字。
用正則表達式的語言來描述是:正則表達式 “Room\d\d\d”共捕獲7個字符,表示“以Room開頭、以三個數(shù)字結(jié)尾”的一類字符串,我們把這一類字符串稱作一個模式(Pattern),也稱作是一個正則。
一,轉(zhuǎn)義字符
轉(zhuǎn)義字符是\,把普通字符轉(zhuǎn)義為具有特殊含義的元字符,常用的轉(zhuǎn)義字符有:
\t
:水平制表符\v
:垂直制表符\r
:回車\n
:換行\\
:表示字符 \,也就說,把轉(zhuǎn)義字符 \ 轉(zhuǎn)義為普通的字符 \\"
:表示字符 ",在C#中,雙引號用于定義字符串,字符串包含的雙引號用 \" 來表示二,字符類
在進行正則匹配時,把輸入文本看作是有順序的字符流,字符類元字符匹配的對象是字符,并會捕獲字符。所謂捕獲字符是指,一個元字符捕獲的字符,不會被其他元字符匹配,后續(xù)的元字符只能從剩下的文本中重新匹配。
常用的字符類元字符:
[ 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
:匹配任意一個數(shù)字字符\D
:匹配任意一個非數(shù)字字符注意,轉(zhuǎn)義字符也屬于字符類元字符,在進行正則匹配時,也會捕獲字符。
三,定位符
定位符匹配(或捕獲)的對象是位置,它根據(jù)字符的位置來判斷模式匹配是否成功,定位符不會捕獲字符,是零寬的(寬度為0),常用的定位符有:
^
:默認情況下,匹配字符串的開始位置;在多行模式下,匹配每行的開始位置;$
:默認情況下,匹配字符串的結(jié)束位置,或 字符串結(jié)尾的\n之前的位置;在多行模式下,匹配每行結(jié)束之前的位置,或者每行結(jié)尾的\n之前的位置。\A
:匹配字符串的開始位置;\Z
:匹配字符串的結(jié)束位置,或 字符串結(jié)尾的\n之前的位置;\z
:匹配字符串的結(jié)束位置;\G
:匹配上一個匹配結(jié)束的位置;\b
:匹配一個單詞的開始或結(jié)束的位置;\B
:匹配一個單詞的中間位置;四,量詞、貪婪和懶惰
量詞是指限定前面的一個正則出現(xiàn)的次數(shù),量詞分為兩種模式:貪婪模式和懶惰模式,貪婪模式是指匹配盡可能多的字符,而懶惰模式是指匹配盡可能少的字符。默認情況下,量詞處于貪婪模式,在量詞的后面加上?來啟用懶惰模式。
*
:出現(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} 等價于 \d\d,只是出現(xiàn)兩個數(shù)字,并不要求兩個數(shù)字是相同的。要表示相同的兩個數(shù)字,必須使用分組來實現(xiàn)。
五,零寬斷言
零寬是指寬度為0,匹配的是位置,所以匹配的子串不會出現(xiàn)在匹配結(jié)果中,而斷言是指判斷的結(jié)果,只有斷言為真,才算匹配成功。
對于定位符,可以匹配一句話的開始、結(jié)束(^ $)或者匹配一個單詞的開始、結(jié)束(\b),這些元字符只匹配一個位置,指定這個位置滿足一定的條件,而不是匹配某些字符,因此,它們被成為 零寬斷言。所謂零寬,指的是它們不與任何字符相匹配,而匹配一個位置;所謂斷言,指的是一個判斷,正則表達式中只有當斷言為真時才會繼續(xù)進行匹配。零寬斷言可以精確的匹配一個位置,而不僅僅是簡單的指定句子或者單詞。
正則表達式把文本看作從左向右的字符流,向右叫做后向(Look behind),向左叫做前向(Look ahead)。對于正則表達式,只有當匹配到指定的模式(Pattern)時,斷言為True,叫做肯定式,把不匹配模式為True,叫做否定式。
按照匹配的方向和匹配的定性,把零寬斷言分為四種類型:
(?=
pattern):前向、肯定斷言
(?!
pattern):前向、否定斷言
(?<=
pattern):后向、肯定斷言
(?<!
pattern):后向、否定斷言
1,前向肯定斷言
前向肯定斷言定義一個模式必須存在于文本的末尾(或右側(cè)),但是該模式匹配的子串不會出現(xiàn)在匹配的結(jié)果中,前向斷言通常出現(xiàn)在正則表達式的右側(cè),表示文本的右側(cè)必須滿足特定的模式:
(?=
subexpression)
使用前向肯定斷言可以定一個模糊匹配,后綴必須包含特定的字符:
\b\w+(?=\sis\b)
對正則表達式進行分析:
\b
:表示單詞的邊界\w
+:表示單詞至少出現(xiàn)一次(?=\sis\b)
:前向肯定斷言,\s 表示一個空白字符, is 是普通字符,完全匹配,\b 是單詞的邊界。從分析中,可以得出,匹配該正則表達式的文本中必須包含 is 單詞,is是一個單獨的單詞,不是某一個單詞的一個部分。舉個例子
Sunday is a weekend day 匹配該正則,匹配的值是Sunday,而The island has beautiful birds 不匹配該正則。
2,后向肯定斷言
后向肯定斷言定義一個模式必須存在于文本的開始(或左側(cè)),但是該模式匹配的子串不會出現(xiàn)在匹配的結(jié)果中,后向斷言通常出現(xiàn)在正則表達式的左側(cè),表示文本的左側(cè)必須滿足特定的模式:
(?<= subexpression )
使用后向肯定斷言可以定一個模糊匹配,前綴必須包含特定的字符:
(?<=\b20)\d{2}\b
對正則表達式進行分析:
(?<=\b20)
:后向斷言,\b表示單詞的開始,20是普通字符\d{2}
:表示兩個數(shù)字,數(shù)字不要求相同\b
:單詞的邊界該正則表達式匹配的文本具備的模式是:文本以20開頭、以兩個數(shù)字結(jié)尾。
六,分組和捕獲字符
() 括號不僅確定表達式的范圍,還創(chuàng)建分組,()內(nèi)的表達式就是一個分組,引用分組表示兩個分組匹配的文本是完全相同的。定義一個分組的基本語法:
(pattern)
該類型的分組會捕獲字符,所謂捕獲字符是指:一個元字符捕獲的字符,不會被其他元字符匹配,后續(xù)的元字符只能從剩下的文本中重新匹配。
1,分組編號和命名
默認情況下,每個分組自動分配一個組號,規(guī)則是:從左向右,按分組左括號的出現(xiàn)順序進行編號,第一個分組的組號為1,第二個為2,以此類推。也可以為分組指定名稱,該分組稱作命名分組,命名分組也會被自動編號,編號從1開始,逐個加1,為分組指定名稱的語法是:
(?<
name>
pattern)
通常來說,分組分為命名分組和編號分組,引用分組的方式有:
注意,分組只能后向引用,也就是說,從正則表達式文本的左邊開始,分組必須先定義,然后才能在定義之后面引用。
在正則表達式里引用分組的語法為“\number”,比如“\1”代表與分組1 匹配的子串,“\2”代表與分組2 匹配的字串,以此類推。
例如,對于 "<(.*?)>.*?</\1>" 可以匹配 <p>valid</p>,在引用分組時,分組對應(yīng)的文本是完全相同的。
2,分組構(gòu)造器
分組構(gòu)造方法如下:
(pattern)
:捕獲匹配的子表達式,并為分組分配一個組號(?< name > pattern):把匹配的子表達式捕獲到命名的分組中
(?:pattern):非捕獲的分組,并未分組分配一個組號
(?> pattern):貪婪分組
3,貪婪分組
貪婪分組也稱作非回溯分組,該分組禁用了回溯,正則表達式引擎將盡可能多地匹配輸入文本中的字符。如果無法進行進一步的匹配,則不會回溯嘗試進行其他模式匹配。
(?> pattern )
4,二選一
|
的意思是或,匹配兩者中的任意一個,注意,|
把左右兩邊的表達式分為兩部分。
pattern1 | pattern2
關(guān)于C#中的正則表達式就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。