([^\s]+(?=\.(jpg|jpeg|png|gif))\.\2)
和这个:
([^\s]+(?=\.(jpg|jpeg|png|gif))\.\1)
它是如何匹配的?我很确定开始部分会去掉空格……还是这样?
谢谢。
([^\s]+(?=\.(jpg|jpeg|png|gif))\.\2)
和这个:
([^\s]+(?=\.(jpg|jpeg|png|gif))\.\1)
它是如何匹配的?我很确定开始部分会去掉空格……还是这样?
谢谢。
这两个是可怕的正则表达式。你在哪里找到他们?
首先,[^\s]+
您可以简单地编写\S+
(= 一个或多个非空白字符。),而不是 。
第二部分(?=\.(jpg|jpeg|png|gif))
在字符串中向前看,以确保字符串的以下部分是一个点,后跟列出的图形文件扩展名之一。
然后,\.\2
匹配完全相同的文本,使之前的前瞻断言完全没有意义。\2
指第二对捕获括号的内容(即 周围的括号jpg|jpeg|png|gif
)。
所以第一个正则表达式可以重写为
\S+\.(jpe?g|png|gif)
第二个永远不会匹配(并且会导致大多数(如果不是全部)编译器咳嗽和死亡),因为\1
它指的是第一组括号的内容,它(完全无用)围绕整个正则表达式。当然,您不能将整个匹配作为其自身的一部分。
[^\s]+
- 匹配 1 个或多个非空白字符;(?=\.(jpg|jpeg|png|gif)
- 零宽度(意味着它不消耗输入)正向前瞻,它断言在上述表达式之后,您有一个点 ( \.
),然后是这四个图像扩展名之一;\.\2
- 匹配一个点,然后是第二个捕获的组,即(jpg|jpeg|png|gif)
.总之,([^\s]+(?=\.(jpg|jpeg|png|gif))\.\2)
, 匹配 1 个一个或多个非空白字符(可能是文件名),后跟以下扩展名之一:.jpg
、.jpeg
、.png
或.gif
.
第二个基本相同,但由于\1
是指整个捕获的文本,它永远不会匹配任何内容。