精通正規表示式四 環視功能

2021-08-03 09:17:04 字數 2094 閱讀 1913

環視有下面四種型別

(?=...)   肯定順序環視,子表示式能匹配右側的文字

(?!...) 否定順序環視,子表示式不能匹配右側的文字

(?<=...) 肯定逆序環視,子表示式能匹配左側的文字

(?...) 否定逆序環視,子表示式不能匹配左側的文字

同樣,先舉例子:

這是乙個肯定順序環視,如果a的右側是數字,那麼就能匹配到a。

再來看一下否定順序環視,其實根據上面就很好理解,如果a的右側不是數字,那麼就匹配a:

結果正如所預料的那樣,但要注意的是,a的左側沒有字元也匹配了,所以『(?!\d)』與『\d』是不同的,『\d』表達的是某個數字不是字元,但前提是要有這個字元:

逆序環視和順序環視是類似的,只不過它匹配的是左側的文字,這裡不做過多演示,而且在regexr上也不支援逆序環視。

通過上面的例子,我們還可以發現,環視不會占用字元,也就是說,環視它就是看一下是不是,但並不會匹配它,也就不會占用這個字元:

可以看到,肯定環視中的『\d』並沒有匹配字元,而是後面的那個『\d』匹配了。

先來看乙個簡單的例子,比如我要將toms改為tom』s,就可以用環視來解決:

my

$name = 'toms';

$name =~ s/(?<=tom)(?=s)/'/g;

這樣看來環視的作用並不是很大,因為不用環視也能完成這項工作並且也不複雜:

my

$name = 'toms';

$name =~ s/(tom)(s)/$1'$2/g;

在來看乙個例子,就能體會環視的作用了,它採用的就是環視不占用字元的特點,在數值間插入逗號,比如『12345678』變為『12,345,678』。

逗號插入的位置有這樣的特點,左邊是數字,右邊的數字是三的倍數,如果不用環視來匹配的話,要這樣

my

$num = 12345678;

$num =~ s/(\d)((\d\d\d)+\b)/$1,$2/g

但這樣能加入所有的逗號嗎?答案是否定的,因為『(\d\d\d)+\b』已經將後面的字元都占用了,就不會再次匹配。但它也可以完成,過要加乙個while迴圈不斷匹配,直到匹配不上為止:

while($num =~ s/(\d)((\d\d\d)+\b)/$1,$2/g){}
接下來用環視來做,

my

$num = 12345678;

$num =~ s/(?<=\d)(?=((\d\d\d)+$))/,/g;

因為regexr上不支援逆序環視,所以也可以這樣:

my

$num = 12345678;

$num =~ s/(\d)(?=((\d\d\d)+$))/$1,/g;

看看匹配結果:

正是我們所需要的將『2』和『5』替換為『2,』和『5,』。

如果要將乙個檔案中所有的數字都加上逗號,可以在終端用一條命令完成:

perl -p -i -e 's/(?<=\d)(?=((\d

\d\d)+\b))/,/g' word.txt

雖然不用環視也能完成,但效率明顯要低很多!

正規表示式學習 三 環視(lookaround)

1.環視結構 lookaround 不匹配任何字元,只匹配文字中的特定位置,這一點與單詞分界符 b 錨點 相似。2.順序環視 lookahead 順序環視從左至右檢視文字,嘗試匹配子表示式,如果能匹配,就返回匹配成功的資訊。3.肯定型順序環視 positive lookahead 用特殊的序列 表示...

正規表示式環視

正規表示式環視 1.環視又叫預搜尋和零寬斷言 2.環視又劃分為 表示式說明 expression 逆序肯定環視,表示所在位置左側能夠匹配expression 逆序否定環視,表示所在位置左側不能匹配expression expression 順序肯定環視,表示所在位置右側能夠匹配expression ...

正規表示式環視

4種環視 順序肯定環視 pattern 逆序肯定環視 pattern 順序否定環視 pattern 逆序否定環視 注意 環視是不會占用物理匹配的 順序肯定環視的2種用法 環視在左表示式在右 二次篩選匹配 表示式在右環視在左 以表示式環視結尾 如 字元aa1235206894 s d 環視匹配前6位任...