老男孩帶你了解perl正規表示式中的零寬斷言

2021-09-04 10:19:56 字數 3322 閱讀 8124

本文只介紹perl語言正規表示式的零寬斷言功能。

零寬斷言實質:匹配文字裡面的位置。

零寬斷言叫

zero-length assertions

,也叫lookaround(這個更容易理解)。

包括:lookahead(向

前看,零寬度正**先行斷言),

lookbehind

(向後看,零寬度正回顧後發斷言)。

從左到右對文字進行匹配,判斷是否符合exp表示式。

名字表示式

如果子表示式成功則

…positive lookahead

(零寬度正**先行斷言)

(?=subexp)

如果匹配到右邊則成功

negative lookahead

(零寬度負**先行斷言)

(?!subexp)

如果沒有匹配到右邊則成功

注:成功就是找到對應的

位置

如圖所示:首先這個是lookahead(向前看)他匹配

exp這個詞(

oldboy

)之前的乙個位置,同時是

positive lookahead

是表示匹配到

exp就成功的意思。

注:先理解lookahead的含義。然後對比理解positive lookahead和negative lookahead的區別。

lookbehind(向後看),從右向左匹配,判斷是否符合exp表示式。

名字表示式

如果子表示式成功則

…positive lookbehind

(零寬度正回顧後發斷言)

(?<=subexp)

如果匹配到左邊則成功

negative lookbehind

(零寬度負回顧後發斷言)

(?如果沒有匹配到左邊則成功

#注:成功就是找到對應的

位置

如圖所示lookahead匹配的位置是在

subexp

之前,lookbehind

匹配的位置是在

subexp

之後。轉義字元

含義\b

單詞的邊界。

\w表示

[a-za-z0-9_]

中任意乙個字元

\w與\w

相反表示不在

[a-za-z0-9_]

中的任意字元

\d[0-9]中的乙個數字

\d不在[0-9]中的任意字元

1.6案例1:實戰演示:取ip位址

基本格式,紅色就是我們的目標。

[root@node1 oldboy]# ifconfig eth0

eth0      link encap:ethernet  hwaddr 00:0c:29:3a:c5:88  

inet addr:192.168.85.50bcast:192.168.85.255  mask:255.255.255.0

inet6 addr: fe80::20c:29ff:fe3a:c588/64 scope:link

up broadcast running multicast  mtu:1500  metric:1

rx packets:81923 errors:0 dropped:0 overruns:0 frame:0

tx packets:26480 errors:0 dropped:0 overruns:0 carrier:0

collisions:0 txqueuelen:1000

rx bytes:96099065 (91.6 mib)  tx bytes:3459424 (3.2 mib)

方法一:使用positive lookahead(正常向前看,零寬度正**先行斷言)

[root@node1 oldboy]# ifconfig eth0 | grep -op "[0-9.]+(?=  bcast)"

192.168.85.50

[root@node1 oldboy]# ifconfig eth0 | grep -op "[\d.]+(?=  bcast)"

192.168.85.50

說明:1.這裡使用lookahead的時候要注意,bcast前面有兩個空格,匹配時要注意他們。

2.前面已經說過,

\d è

[0-9]

方法二:使用

positive lookbehind

(正常向後看,零寬度正回顧後發斷言)

[root@node1 oldboy]# ifconfig eth0 | grep -op '(?<=\baddr:)[\d.]+'

192.168.85.50

方法三:使用零寬度負**先行斷言

[root@node1 oldboy]# ifconfig eth0|grep -op 'addr:[\d\.]+(?![\d\.])'

addr:192.168.85.50

但是去掉"addr:"還是需要使用lookbehind(向後看,零寬度正回顧後發斷言)

[root@node1 oldboy]# ifconfig eth0|grep -op '(?<=addr:)[\d\.]+(?![\d\.])'

192.168.85.50

方法四:使用零寬度負向回顧後發斷言

[root@node1 oldboy]# ifconfig eth0|grep -op '(?

192.168.85.50  bca

但是後面的去除需要使用使用零寬度正**先行斷言

[root@node1 oldboy]# ifconfig eth0|grep -op '(?

192.168.85.50

Perl 正規表示式

正規表示式文中列表 將下乙個字元標記為乙個特殊字元 或乙個原義字元 或乙個後向引用 或乙個八進位制轉義符。匹配輸入字串的開始位置。如果設定了 regexp 物件的multiline 屬性,也匹配 n 或 r 之後的位置。匹配輸入字串的結束位置。如果設定了 regexp 物件的multiline 屬性...

Perl正規表示式

元字元 元字元的含義是具有特殊含義的字元,即為元字元,元字元包括 點號能夠匹配所有的單字元,但是換行字元除外 n 簡易量詞 記載匹配正規表示式的時候有些需要重複的字元或者字串,我們在表示這種重複的形式的時候,即是量詞,我們知道的量詞有 表示至少重複一次,表示重複一次或者一次 以上,指的是重複一次或者...

perl 正規表示式

匹配 m 還可以簡寫為 略去 m 替換 s 轉化 tr 這三種形式一般都和 或 搭配使用 其中 表示相匹配,在整條語句中讀作 does,表示不匹配,在整條語句中讀作 doesn t 並在左側有待處理的標量變數。如果沒有該變數和 操作符,則預設為處理 變數中的內容。舉例如下 str i love pe...