站長資訊網
        最全最豐富的資訊網站

        C#之正則表達式介紹

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

        C#之正則表達式介紹

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

        C#之正則表達式介紹

        用正則表達式的語言來描述是:正則表達式 “Roomddd”共捕獲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} 等價于 dd,只是出現兩個數字,并不要求兩個數字是相同的。要表示相同的兩個數字,必須使用分組來實現。

        C#之正則表達式介紹

        五,分組和捕獲字符

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

        (pattern)

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

        1,分組編號和命名

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

        (?< name > pattern)

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

        • 通過分組名稱來引用分組:k<name>
        • 通過分組編號來引用分組:number

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

        在正則表達式里引用分組的語法為“number”,比如“1”代表與分組1 匹配的子串,“2”代表與分組2 匹配的字串,以此類推。

        例如,對于 "<(.*?)>.*?</1>" 可以匹配 <p>valid</p>,在引用分組時,分組對應的文本是完全相同的。

        2,分組構造器

        分組構造方法如下:

        • (pattern):捕獲匹配的子表達式,并為分組分配一個組號
        • (?< name > pattern):把匹配的子表達式捕獲到命名的分組中
        • (?:pattern):非捕獲的分組,并未分組分配一個組號
        • (?> pattern):貪婪分組

        3,貪婪分組

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

        (?> pattern )

        4,二選一

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

        pattern1 | pattern2

        六,零寬斷言

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

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

        正則表達式把文本看作從左向右的字符流,向右叫做后向(Look behind),向左叫做前向(Look ahead)。對于正則表達式,只有當匹配到指定的模式(Pattern)時,斷言為True,叫做肯定式,把不匹配模式為True,叫做否定式。

        按照匹配的方向和匹配的定性,把零寬斷言分為四種類型:

        • (?= pattern):前向、肯定斷言
        • (?! pattern):前向、否定斷言
        • (?<= pattern):后向、肯定斷言
        • (?<! pattern):后向、否定斷言

        1,前向肯定斷言

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

        (?= subexpression )

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

        bw+(?=sisb)

        對正則表達式進行分析:

        • b:表示單詞的邊界
        • w+:表示單詞至少出現一次
        • (?=sisb):前向肯定斷言,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開頭、以兩個數字結尾。

        推薦學習:C#.Net教程

        贊(0)
        分享到: 更多 (0)
        網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
        主站蜘蛛池模板: 国内精品久久久久影院网站 | 亚欧乱色国产精品免费视频| 亚洲AV无码成人网站久久精品大| 国产精品欧美亚洲韩国日本| 日韩精品无码久久一区二区三| 99精品久久精品一区二区| 国内精品久久久久影院网站| 第一福利永久视频精品| 日本加勒比久久精品| 久久99精品国产99久久6男男| 偷拍精品视频一区二区三区| 国产精品户外野外| 亚洲国产精品一区| 精品国产一区二区三区免费| 精品国产sm捆绑最大网免费站| 亚洲欧美一级久久精品| 人妻少妇精品久久| 久久精品国产亚洲一区二区三区| 国产精品99久久精品爆乳| 高清日韩精品一区二区三区| 嫩草影院久久国产精品| 精品久久久久久久| 国产成人精品免费视频网页大全| 精品蜜臀久久久久99网站| 久久精品国产亚洲AV大全| 全球AV集中精品导航福利| 亚洲愉拍99热成人精品热久久 | 国产精品九九久久免费视频| 香蕉国产精品频视| 欧美日韩精品在线| 四虎影视国产精品永久在线| 老司机99精品99| 亚洲人成亚洲精品| 国产精品v欧美精品v日本精| 91精品视频观看| 国产精品免费久久久久影院| 国产三级国产精品国产普男人| 精品少妇一区二区三区在线| 免费精品久久久久久中文字幕 | 国产精品videossex白浆| 精品久久久久久久久久中文字幕 |