查詢不以baidu開頭的字串正則:^(?!baidu).*$ 匹配結果就是第2行,也就是第1行被排除了
這裡使用了零寬度斷言(?!exp),注意,我們有乙個向前查詢的語法(也叫順序環視) (?=exp)
(?=exp) 會查詢exp之前的【位置】如果將等號換成感嘆號,就變成了否定語義,也就是說查詢的位置的後面不能是exp
一般情況下?!要與特定的錨點相結合,例如^行開頭或者行結尾
,那麼上
面的例子
的意思如
下:(?
!bai
du).
∗行結尾,那麼上面的例子的意思如下: ^(?!baidu).*
行結尾,那麼
上面的例
子的意思
如下:(
?!ba
idu)
.∗先匹配乙個行開頭的位置,並且要求接下來的位置的後面不是baidu這個字串。這樣由於第一行^之後的位置後面是baidu所以匹配失敗,被排除在外了。
查詢不以com結尾的字串正則 ^.?(??(?<=com)或者.
∗?co
m或者 ^.*?com
或者.∗?c
om對正規表示式的解釋:^.?(?? 這個是忽略優先,也就是優先忽略不匹配任何字元,(?對應的
行尾失敗
,一直到
.∗?匹
配了ww
w.ba
idu.
com的
時候,此
時(
?
om)匹
配m後面
的位置,
此時此位
置的前面
是com
匹配直接
失敗,接
著.∗?
匹配行末
尾,(?
om)匹
配對應的行尾失敗,一直到.*?匹配了www.baidu.com的時候,此時(?對應
的行尾失
敗,一直
到.∗?
匹配了w
ww.b
aidu
.com
的時候,
此時(?
om)匹
配m後面
的位置,
此時此位
置的前面
是com
匹配直接
失敗,接
著.∗?
匹配行末
尾,(?
om)匹
配後面的位置,顯然這次也失敗了,所以整個全域性匹配都失敗。 www.123.com被排除到匹配之外。這裡的.*後面加不加問號結果都一樣。
查詢不含有if的行
if (a>b)
printf(「hello」);
else if(a正則 ([f]|[^i]f)+$
其實這個匹配也是乙個排除型字串的匹配,但是不同於上面兩種,因為這裡的if可能既不在行開頭,也不在行結尾,而是在字串中間這樣就給匹配帶來了麻煩,在正規表示式中沒有提供類似排除的功能。我們最容易想到的就是下面的正則:
[if]+$ 這種寫法看起來是那麼回事,但是排除型字元組排除的是i和f兩個字元,而不是if這個字串,所以這個正規表示式匹配的是那些既沒有i字元也不包含f字元的字串。但是如果字串中有乙個i或多個i或者有乙個或多個f,或者i和f字元都有只不過沒有連在一起。這些情況都是我們需要匹配的情況,而我們不能匹配的情況是那些包含if字串的行,而不是包含i或f字元的行,所以這種寫法漏洞很大。
^.(?!if).$ 這種寫法使用了零寬度斷言,表面意思看起來好像是說 任意字元+非if+任意字元 組成了整個字串,但是仔細研究匹配過程就知道這個是錯的,(?!if)匹配的是乙個位置,所以對於字串aifb他也是可以匹配到的,而實際上這樣的字元正是我們不要的。按照這個正規表示式,對於aifb 首先匹配行首,其次.*是貪婪模式(匹配優先),會一直匹配到字串的末尾(此時傳動裝置定位在$位置前面),此時(?!if)需要匹配乙個位置,這個位置的後面不能是if,這個時候正好位置在b字元的後面,符合匹配條件,緊接著匹配行尾,到這裡整個全域性匹配成功。
也就是說對於乙個字串例如我要排除abc這個字串,那麼對於任意乙個字串 helloworld abc helloworld 在匹配的時候(?!abc)可以匹配h、e、l、l、o、w、o、r、l、d等這些字元後面的位置,都是成功的。所以匹配根本還沒有進行到abc這個地方,(?!abc)就會匹配成功。這個時候根本起不到排除的作用,為什麼上面的第1和第2個例子可以呢,因為他們的位置有行首和行尾限定。例如我要匹配行首不是abc的話,那麼此時^(?!abc) 這個時候(?!abc)實際上在匹配的時候其傳動裝置的位置被行首進行了限定,所以對於那些以abc開頭的字串來說就會匹配失敗了。
對於正規表示式^.(?!abc).$怎麼能讓第乙個.*匹配到 helloworldabc***中的helloworld的問題。
對於上面的題目,我們的答案是([f]|[^i]f)+$ 其實就將所有的匹配分成了2種情況,一種情況是假設字串中沒有f字元, 自然就不可能有if字串了,這種情況下匹配的字串中是不可能有if的。第二種情況就是有f字元,但是我們要求此時f的前面不能是i,所以在有f和沒有f兩種情況都考慮到的情況下,這個正則就應該可以滿足所有的情況了。
其實這個問題的解答是不完美的,對於排除的字串if只有2個字元i和f字元,我們可以使用這種方式,但是如果我們要排除的是字串helloworld,這種方法顯然就不實用了,那要考慮到多少種情況呢?
排除不含有某字串的最終方案:在這種情況下我們使用 ^(?!.helloworld).$ 正規表示式 我們將第乙個.*移到了零寬度斷言的裡面。在匹配的時候首先匹配行首的位置,然後接下來是匹配行首後面的位置,要求此位置的後面不能是 .*helloworld 匹配的字串,說白了要求此位置的後面不能是******************helloworld 類似的字串,這樣就排除了從行首開始後面含有helloworld的情況了。
利用正規表示式排除特定字串
1.例子,查詢不以baidu開頭的字串。正則 baidu 匹配結果就是第2行,也就是第1行被排除了 這裡使用了零寬度斷言 exp 注意,我們有乙個向前查詢的語法 也叫順序環視 exp exp 會查詢exp之前的 位置 如果將等號換成感嘆號,就變成了否定語義,也就是說查詢的位置的後面不能是exp 一般...
正規表示式排除特定字串
額外知識一 asp.net正則獲取鏈結 regex reg new regex href regexoptions.ignorecase matchcollection matches reg.matches html foreach match match in matches 額外知識點二 as...
python利用正規表示式排除集合中字元的功能示例
前言 我們在之前學習過通過集合列舉的功能,把所有需要出現的字元列出來儲存在集合裡面,這樣正規表示式就可以根據集合裡的字元是否存在來判斷是否匹配成功,如果在集合裡,就匹配成功,否則不成功。現在有乙個問題,就是要把集合裡列出的字元都不能出現才匹配成功,這個需求怎麼樣實現呢?其實比較簡單,只需要在集合前面...