一切福田,不離方寸,從心而覓,感無不通。

正则表达式匹配最后一部分

今天,同事问了我一个正则,最后解决了,给大家提供一下参考。用于取网址的最后一部分。本文用于讲解(?= 和 ?<= 和 ?>=和 ?! 的用法)

数据如下:

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 这样的表达式长度可变,不能用在后顾中

备注:最近太忙,看半天也没有真正理解,先记录一下,回头有空再看。
————————————————
版权声明:本文为CSDN博主「白夜鬼魅」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/shuryuu/article/details/82910857