1. 程式人生 > >正則表示式匹配最後一部分

正則表示式匹配最後一部分

今天,同事問了我一個正則,最後解決了,給大家提供一下參考。用於取網址的最後一部分。本文用於講解(?= 和 ?<= 和 ?>=和 ?! 的用法)

資料如下:

https://download.microsoft.com/download/5/3/8/5388ECC4-C2E2-4D40-8C21-D1EA26FEA0CA/msodll40ui2016-kb4018324-fullfile-x86-glb.exe

https://download.microsoft.com/download/B/2/5/B25D200D-804D-44B9-A345-9D1A21386470/osetup2010-kb4022208-fullfile-x86-glb.exe
https://download.microsoft.com/download/6/7/0/6703678B-8270-41ED-B16B-5F7D08D05A84/osetup2010-kb4022208-fullfile-x64-glb.exe

https://download.microsoft.com/download/6/B/1/6B1BD3F3-A8CC-44BA-86EF-E85A0E066E33/ose2010-kb4022206-fullfile-x86-glb.exe
https://download.microsoft.com/download/9/0/1/901D9393-AB8E-4018-BF2D-78341A0B60BE/ose2010-kb4022206-fullfile-x64-glb.exe

通過如下正則可以匹配 / 之後的部分:[^/]+(?!.*exe)
匹配到的資料如下:

msodll40ui2016-kb4018324-fullfile-x86-glb.exe

osetup2010-kb4022208-fullfile-x86-glb.exe
osetup2010-kb4022208-fullfile-x64-glb.exe

ose2010-kb4022206-fullfile-x86-glb.exe
ose2010-kb4022206-fullfile-x64-glb.exe

說明:

[^/]+ 表示匹配任意長度的字串,字串中不包含有字元 / ,就可以把以 / 分割開的字串全匹配到.

.*exe 表示任意以exe 結尾的字串,可以把後在帶有exe的字串匹配到,前面再加上?!,再用圓括號包住表示排除掉(?!.*exe)
整個表示式的意思就是匹配任意長度的不包含/ 的字串,並把以exe結尾的字串匹配出來。

舉個例子進行講解:

有個字串如下

str = "程式人生 程式 人生 序人"

我們想匹配字串裡"程式人生"的"人"字而不要其他的"人"字,這時就需要用到前瞻後顧。

正則表示式如下:

(?<=程式)人(?=生)
反過來,我們不想要"程式人生"的"人"字,但是想要其他"人"字。這時就要用到負前瞻,負後顧

正則表示式如下:

(?<!程式)人(?!生)
總結一下:

前瞻: exp1(?=exp2)     查詢exp2前面的exp1

後顧:  (?<=exp2)exp1   查詢exp2後面的exp1

負前瞻:  exp1(?=exp2)     查詢後面不是exp2的exp1

負後顧:  (?<=exp2)exp1   查詢前面不是exp2的exp1

可以發現,負前瞻、負後顧就是把前瞻、後顧中的"="改成了"!"

注意:後顧功能在大多數語言中有長度限制,只能使用定長的表示式,像\w+和\d 這樣的表示式長度可變,不能用在後顧中

備註:最近太忙,看半天也沒有真正理解,先記錄一下,回頭有空再看。