分類程式碼/語法說明 捕獲(exp)匹配exp,並捕獲文字到自動命名的組裡 (?<name>exp)匹配exp,並捕獲文字到名稱為name的組裡,也可以寫成(?"name"exp) (?:exp)匹配exp,不捕獲匹配的文字,也不給此分組分配組號 零寬斷言(?=exp)匹配exp前面的位置 (?<=exp)匹配exp後面的位置 (?!exp)匹配後面跟的不是exp的位置 (?<!exp)匹配前面不是exp的位置 註釋(?#comment)這種型別的分組不對正則表示式的處理產生任何影響,用於提供註釋讓人閱讀 “(?<!exp)"的意思是匹配前面不是exp的位置 因此匹配前面不是反斜槓的正則表示式應該這樣寫:(?<!\\)\* 感覺關於零寬斷言的內容寫的比較晦澀難懂(鬱悶的發現很多網上關於這個內容的介紹就是直接copy了這篇文章的內容),透過自己的理解整理了一下。 第一種是所謂的零寬度正預測先行斷言,以(?=exp)的形式出現,它匹配的是exp前面的那個位置,特別要注意的是它匹配的只是一個位置,而不是任何字元。比如,\b\w+(?=ing\b)在查詢I"msingingwhileyou"redancing的時候會匹配sing和danc,因為其中的(?=ing)匹配了singing的sing和ing之間的那個位置,還有dancing的danc和ing之間的位置,即ing之前的那個位置。如果理解了第一種零寬斷言,後面的三種也就很好理解了。 第二種是零寬度正回顧後發斷言,以(?<=exp)的形式出現,它匹配的是exp後面的那個位置。同樣是上面的那個例子,如果正則表示式變為\b\w+(?<=ing\b),匹配結果就變成了singing和dancing,因為(?<=ing)匹配的是ing後面的位置。 第三種是零寬度負預測先行斷言,以(?!exp)的形式出現,它匹配的是後面跟的不是exp的位置。比如\b\w+n(?!g)\w+\b,在查詢I"msingingwhileyou"redancing的時候匹配了dancing,因為n(?!g)指的就是n後面不跟g,所以雖然有好幾個單詞裡都有n,但是隻有dancing裡有n後面不跟g。 第四種是零寬度正回顧後發斷言,以(?<!exp)的形式出現,它匹配的是前面不是exp的位置。同樣是第三種情況的那個例子,如果用\b\w+n(?<!g)\w+\b去查詢I"msingingwhileyou"redancing的話會匹配singing和dancing,因為這兩個單詞的n的前面都不是g。 總之,零寬斷言是用來匹配和exp相關的位置的,不是匹配任意的字元。 如:匹配《count="2016"》《count="5679"》《count="2347"》《count="1234"》字串中不是《count="1234"》的所有內容可以寫作的正則式:count="((?!1234)\d)+?"
分類程式碼/語法說明 捕獲(exp)匹配exp,並捕獲文字到自動命名的組裡 (?<name>exp)匹配exp,並捕獲文字到名稱為name的組裡,也可以寫成(?"name"exp) (?:exp)匹配exp,不捕獲匹配的文字,也不給此分組分配組號 零寬斷言(?=exp)匹配exp前面的位置 (?<=exp)匹配exp後面的位置 (?!exp)匹配後面跟的不是exp的位置 (?<!exp)匹配前面不是exp的位置 註釋(?#comment)這種型別的分組不對正則表示式的處理產生任何影響,用於提供註釋讓人閱讀 “(?<!exp)"的意思是匹配前面不是exp的位置 因此匹配前面不是反斜槓的正則表示式應該這樣寫:(?<!\\)\* 感覺關於零寬斷言的內容寫的比較晦澀難懂(鬱悶的發現很多網上關於這個內容的介紹就是直接copy了這篇文章的內容),透過自己的理解整理了一下。 第一種是所謂的零寬度正預測先行斷言,以(?=exp)的形式出現,它匹配的是exp前面的那個位置,特別要注意的是它匹配的只是一個位置,而不是任何字元。比如,\b\w+(?=ing\b)在查詢I"msingingwhileyou"redancing的時候會匹配sing和danc,因為其中的(?=ing)匹配了singing的sing和ing之間的那個位置,還有dancing的danc和ing之間的位置,即ing之前的那個位置。如果理解了第一種零寬斷言,後面的三種也就很好理解了。 第二種是零寬度正回顧後發斷言,以(?<=exp)的形式出現,它匹配的是exp後面的那個位置。同樣是上面的那個例子,如果正則表示式變為\b\w+(?<=ing\b),匹配結果就變成了singing和dancing,因為(?<=ing)匹配的是ing後面的位置。 第三種是零寬度負預測先行斷言,以(?!exp)的形式出現,它匹配的是後面跟的不是exp的位置。比如\b\w+n(?!g)\w+\b,在查詢I"msingingwhileyou"redancing的時候匹配了dancing,因為n(?!g)指的就是n後面不跟g,所以雖然有好幾個單詞裡都有n,但是隻有dancing裡有n後面不跟g。 第四種是零寬度正回顧後發斷言,以(?<!exp)的形式出現,它匹配的是前面不是exp的位置。同樣是第三種情況的那個例子,如果用\b\w+n(?<!g)\w+\b去查詢I"msingingwhileyou"redancing的話會匹配singing和dancing,因為這兩個單詞的n的前面都不是g。 總之,零寬斷言是用來匹配和exp相關的位置的,不是匹配任意的字元。 如:匹配《count="2016"》《count="5679"》《count="2347"》《count="1234"》字串中不是《count="1234"》的所有內容可以寫作的正則式:count="((?!1234)\d)+?"