正則表示式匹配最後一部分
今天,同事問了我一個正則,最後解決了,給大家提供一下參考。用於取網址的最後一部分。本文用於講解(?= 和 ?<= 和 ?>=和 ?! 的用法)
資料如下:
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 這樣的表示式長度可變,不能用在後顧中
備註:最近太忙,看半天也沒有真正理解,先記錄一下,回頭有空再看。