正則表達式 詳解

1.作用:搜索和替換——正則表達式的作用



2.匹配單個字符:

正則表達式可以包含純文本當然,這樣用正則表達式也是一種浪費
正則表達式字母大小寫敏感

匹配任意字符:
.元字符可以匹配任意的 一個 字符
我們有時候在文本中還需要去匹配字符.這時候我們的正則表達式中的元字符.已經有了實際的含義,我們就必須對模式中的.進行轉義
這時候我們利用元字符\堆元字符.進行轉義,這時候的正則表達式中.代表的就不是元字符的含義了,我們這時候代表的是.這個這個字符本身
換句話來說,正則表達式更像是一個模式,我們通過指定的模式去在源字符串中匹配相應的子串
但是並不是說正則表達式處理出來的說就是我們需要的而結果,我們還需要對正則表達式處理之後的數據結果再度利用


3.匹配一組字符

元字符[],代表定義一個字符的範圍,我們在該位置要待查的單個字符必須在這個元字符所框定的區間範圍內,注意我們這裏[]待查的是一個單個字符,只不過我們確定了一個範圍的模式
優化,在正則表達式中,我麼還要定義一種區間,在這個區間範圍內的字符全部都滿足我們正則表達式的要求
定義元字符-,在[]元字符之間,我們通過這種方式我們來表示一段字符區間,減少了我們枚舉大量的字符的工作量
合法的字符區間:
A-Z
a-z
A-F
A-z  這裏用的是ASCII的定義,我們的-連字符表示的是在ASCII範圍內的字符連續區間,但常用的區間還是數字和字符區間
注意:我們定義區間的時候首位置必須要低於尾位置,否則會使得模式匹配失敗
-元字符之後在[]之間纔有司機的含義,在[]之外只是一個簡單的純文本匹配
^元字符表示我們取非,這個範圍外的所有的字符都是符合匹配的,^效果是[]全局性的·


4.轉義:

我們都只到正則表達式存在很多的元字符,但是我們需要對元字符本身進行匹配的話的時候,我們就需要用到轉義字符
配對的[]不用做元字符的功用的時候我們必須要將其轉移掉,否則正咋表達是會返回一個錯誤


5.匹配空白元字符:
在正則表達式中,我們的元字符的對象基本可以分爲兩種,一種是純文本,另一種比較特殊的就是我們匹配空白字符
\n
\r
\f換頁
\t
\v
\r\n文本行的結束標記


6.匹配特定的字符序列:
字符類,我們稱之爲字符類
匹配數字(非數字):[0-9]~[0123456789]~[^0123456789]~[^0-9]
但是我們的正則表達式支持我們的\d(任何一個數字),\D(任何一個非數字)
匹配數字和字母:
\w任何一個數字字母下劃線,相當於[a-zA-Z0-9_]
\W[^a-zA-Z0-9_]
匹配空白字符:
\s任何一個空白字符[\f\n\r\t\v]
\S相反[^\f\n\r\t\v]
匹配十六進制或者匹配八進制





第五章: 重複匹配

以上的內容我們講解了如何匹配單個字符,現在下面的額內容我們來講解一下如何同一時間匹配大量的多個字符(重複出現的字符或字符集合)


1.+

想要多次的匹配一個字符我們就只需要在要重複的字符後面加上+,表示重複就可以了
這裏注意+至少匹配一個,不匹配0個字符
給字符集合加上+的時候,我們的+必須放置在元字符[]的外面
在這裏,+也是一個元字符,我們想要匹配+就必須要對+進行轉義
其實在字符集合元字符[]中,我們的其他的元字符都不用手動轉移,我們的編輯器自動會將我們的[]元字符內的元字符轉義


2.*

但是有的時候,我們對摸個字符的需要又是,我們有時候還需要匹配到沒有該字符的情況,也就是該字符我們可以匹配0到任意多次
這是後我們的+元字符就沒有用處了,我們這時候需要用到*元字符來實現這個功能


3.?

有時候,我們有需要匹配0個或者1個字符,這時候我們就需要用到?元字符,該元字符的意義就是,前面被限定的字符或者字符集合只能被匹配0,或者1次


4.重複次數{}

在這裏,我們會發現+,*,?匹配的次數下線是0,或者1,上限沒有確定,但是一旦我們需要確定一個重複的範圍,我們就沒有辦法只通過這三種元字符來實現精確的控制了
這時候,我們引入{}元字符
首先{}本身也是兩個元字符,如果我麼想要對他們本身做模式匹配我們就需要使用轉移符號\
就用#336633這種顏色的RGB值來看,我們會發現我們如果想用+*?來精確匹配是必須要連着寫六次的,但是我們完全可以用{6}來表示這個意思,只有精確的匹配了六次我們纔算是一個成功的匹配,否則我們都認爲匹配失敗


5.{}設定重複的範圍區間

{}語法還支持我們爲串設定一個匹配的次數的區間,也就是說,我們可以爲重複的匹配次數設定一個最小值和最大值,語法類似於{2,4}意思就是最少重複2次,最大重複4次
重複的次數設定成0次
{3,}表示只設定了最小下界,上界沒有限制


6.過度匹配

除了{},?這種確定性的匹配元字符
我們定義的+*都是不確定長度的元字符,這兩種元字符我們在進行處理的時候實際上都是採用貪婪的準則,儘可能在允許的範圍內匹配儘可能多匹配串
但是我們有時候與不想一次性匹配那麼多的元字符,這時候我們就需要懶惰版本的+*元字符,實際上就是在
1.*?
2.+?
3.{n,}?
就有這三種懶惰的元字符匹配版本




第六章:位置匹配

注意這裏的^,$代表的是要匹配的字符串的開頭和結尾的性質,如果開頭有則滿足這個性質開始匹配,開頭沒有這個性質我們則認爲沒有找到任何匹配,^$之後和之前的緊鄰的一個字符就是我們要找的字符串的開頭或者結尾的屬性
1.
首先我們需要了解位置匹配符匹配的不是一個字符,他只是匹配一個位置
有時候我們不只是要對所有的文章進行匹配,我們需要對一段文章的某一段的位置的文本進行匹配,這時候我們就引入了位置匹配的概念
在正則表達式中我麼使用位置界定元字符來界定我們的匹配的位置
\b只匹配一個位置,不匹配任何的字符
\b匹配的位置的描述是匹配一個\w和\W之間的一個位置,也就是它用來分割一個單詞
相反,\B匹配的是一個不是單詞邊界的一個字符位置(可能的情況是:非單詞+非單詞,這裏的+代表的是連接)


2.字符串邊界
定義字符串邊界的元字符有兩個
定義字符串開頭^(這裏的^元字符實際上是一種多用途元字符)——只有在^緊跟在[之後的時候纔會發揮求非操作,如果放在[]的外面並且位於模式串的開頭我們知識後定義爲字符串位置元字符開頭,其餘的時候都只是簡單地模式匹配
定義字符串結尾$


3.分行匹配模式
有的語言的正則表達式引擎支持分行字符串分割標誌
有時候我們要將一整段文本匹配出來,我們這時候就需要用(?m)分行字符串匹配元字符,這個元字符的意思是,我們定義分行符是做字符串模式匹配的結尾,這樣就會避免貪婪字符的任意匹配從而實現將一行的元素都匹配出來




第七章: 子表達式

1.什麼是子表達式:
我們都知道,大多數的元字符都只是支持對我們的元字符的前一個或者後一個字符進行修飾
eg:
;{2,}
但是我們有時候想讓{2,}對一個表達式進行修飾,而不僅僅是{}之前的一個字符,這個時候我們就需要用的打字表達式


2.定義:
子表達式是更大的表達式的一部分,我們將一個大的表達式進行分解,分解成相應的幾個小的表達式,我們的目的是將這些表達式當成一個獨立的元素來使用,子表達式我們用()闊起來
注意()也是一種元字符,一旦我們需要在文本中對()進行匹配的話,我們就需要用轉義符號\(或者\)
這時候我們的一個子表達式中的所有的元素就會單獨作爲一種元素被整體的修飾
這裏我們再引入一個|元字符,該元字符的作用是或匹配,我們每次都匹配|前或者後面的文本,但是這裏就會要注意到和()的聯合使用,因爲|識別的時候我們的|有可能將後面的整個文本都當成是一個元素,這時我們就需要()
(|)就可以很好的解決這個問題


3.子表達式的嵌套
理論上子表達式的嵌套沒有限制層數,但是在實際中我們要適可而止,我們通常將()和|緊密結合,可以寫出
功能強大的枚舉出所有的可行解的情況的正則表達式
其實我們還可以說,()是對|做出了精確地定義        其實()子表達式優點相當於是我們的高級程序設計語言中的邏輯判斷的結合



第八章: 回溯引用,前後一致匹配

這一張我們來講解子表達式的另一個用處,就是定義定義回溯引用
1.回溯引用有什麼用處:
加入我們需要匹配HTML文檔中的標籤,我們就需要利用<[Hh][1-6]>.*?</[hH][1-6]>這樣的文檔標籤,但是我們這裏需要注意到,如果出現了
<h2>....</h3>的情況,我們的正則表達式是檢查不出錯誤的,這時候我們就需要利用子表達是的另一個應用,也就是我們所謂的回溯引用


2.定義回溯引用,回溯引用值得是模式的後半部分 引用在前半部分中定義的子表達式,說實在的回溯引用有點相當於是一個變量
我們這裏的回溯引用\1,\2,\3...\n的意思就是我們那回溯引用之前定義的第n個子表達式


3.注意:
回溯引用只能引用模式裏的子表達式
回溯引用通常從1開始計數,但是有時候\0也是合法的
這裏的第幾個子表達式的定義我們是根據相對位置來判斷的


4.這裏的回溯引用在文本的替換操作的時候,用的將會非常的頻繁,但是我們的替換操作需要兩個正則表達式,一個用來個給出搜索模式,另一個我們用來尋求文本的替換模式,回溯引用可以跨模式使用
在第一個搜索的正則表達式中的文本我們可以在替換的正則表達式中進行回溯引用


第九章:前後查找

前言,有時候,我們需要對文本的莫一部分特定的查找內容,但是我們又不想將文本的特定的表示符抽取出來,我們只想要文本的內容,這時候後我們
爲了防止文本的多餘查找,引入了前後查找的概念


1.向前查找:
向前查找制定了一個我們必須要匹配的但是不在結果中返回的模式,向前查找實際上也就是一個子表達式
eg:
我們想要將URL的協議名稱提取出來,但是我們只要協議的名稱,這時候,我們這麼來用向前查找的子表達式
.+(?=:)這裏我們的.+的意思就是提取協議的名稱,比如http,https,ftp等等
之後的(?=:)子表達式的意思就是,我們定義一個子表達式(向前查找)制定的內容是:也就是說,我們將:之前的所有的文本都匹配出來,但是我們又不要:這個符號作爲我們的匹配的返回的結果


2.根據我們的額描述,其實任意一個子表達式都可以轉化成對應的一個向前查找的模式匹配的子串,我們需要做的額就是隻是給子表達式加上一個?=的子串罷了


3.?=我們稱之爲是向前查找操作符,除了向前查找之外,很多的正則表達式還支持向後查找?<=


4.向前查找的模式的長度是隨意的,是可變的,我們支持在子表達式中使用.*/.+之類的元字符,但是向後查找我們限定了固定的長度,這是所有的正則表達式都遵守的規則


5.我們那還可以將向前查找和向後查找結合起來就可以實現對我們上述提到的HTML 文本的標題內容提取的作用了


6.總計一下,我們的前後查找額實際上的作用是幫我們確定一個我們想要確定的模式的一個具體位置,這裏我們引入一條書與,在之前的我們利用前後查找的思路實際上都可以稱作是正向前或者
正向後查找,整的意思是尋找匹配
還有一種匹配的模式叫做負向前和負向後查找文本,即我們向前或者向後擦好渣和莫表的文本不匹配的文本,我們的這種的表示符也很簡單
(?=) -> (?!)
(?<=) -> (?<!)


第十章:  嵌入條件

1.正則表達式支持在表達式的內部嵌入條件處理的功能
2.正則表達式中的條件我們必須要用?去處理和定義


3.回溯引用條件:
回溯引用條件只在我們的前一個表達式搜索成功的時候我們才允許使用一個表達式


4.定義語法:
(?(一個回溯引用代表條件,這裏的天上的是前面的子表達式的下跪的爲止,一般都是從1開始,並且裏面的數字不能用之前我麼扽回溯引用的\轉義,這是個特殊的語法格式,記住就好)(........這是一個只有在前面的回溯引用執行成功的時候纔會執行的子表達式))
上面的條件判斷式是沒有else語句的,要加上否則判斷的話,我們需要另外一個語法格式
(?(回溯引用的標號)(yes時執行的子表達式)|(false執行的子表達式))


5.前後查找條件
上面我們講述了回溯引用的查找條件,現在我們來講解另一個查找條件,家偶偶前後查找條件
前後查找條件,我們只在一個向前查找或者向後查找成功的時候我們才調用
我們的語法的格式是
(?(?=)(操作成功之後要執行匹配的子表達式))
但是實際上,我們的工作中很少會用到嵌入了前後查找的子表達式
發佈了219 篇原創文章 · 獲贊 112 · 訪問量 27萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章