([^\s]+(?=\.(jpg|jpeg|png|gif))\.\2)
和这一个:
([^\s]+(?=\.(jpg|jpeg|png|gif))\.\1)
它是如何匹配的?我很确定起始部分剥离了白色空间......是吗?
感谢。
答案 0 :(得分:4)
这两个是糟糕的正则表达式。你在哪里找到它们?
首先,您只需编写[^\s]+
(=一个或多个非空白字符),而不是\S+
。
第二部分(?=\.(jpg|jpeg|png|gif))
向前看字符串,以确保字符串的下一部分是一个点,然后是列出的图形文件扩展名之一。
然后,\.\2
完全匹配相同的文本,使之前的先行断言完全没有意义。 \2
是指第二对捕获括号的内容(即jpg|jpeg|png|gif
周围的内容)。
所以第一个正则表达式可以重写为
\S+\.(jpe?g|png|gif)
第二个永远不会匹配(并且会导致大多数(如果不是全部)编译器咳嗽和死亡)因为\1
指的是第一组括号的内容(完全无用地)围绕整个正则表达式。当然,你不能将整场比赛作为其中的一部分。
答案 1 :(得分:3)
[^\s]+
- 匹配1个或多个非空白字符; (?=\.(jpg|jpeg|png|gif)
- 零宽度(意味着它不消耗输入)正向前瞻断言在上面的表达式之后,你有一个点(\.
),接着是这四个图像扩展名之一; \.\2
- 匹配一个点,然后是第二个捕获的组,即(jpg|jpeg|png|gif)
。总之,([^\s]+(?=\.(jpg|jpeg|png|gif))\.\2)
匹配1个一个或多个非空白字符(可能是文件名),后跟以下扩展名之一:.jpg
,.jpeg
,{{1 },或.png
。
第二个基本相同,但由于.gif
指的是整个捕获的文本,它永远不会匹配任何东西。