1
    ([^\s]+(?=\.(jpg|jpeg|png|gif))\.\2)

和这个:

    ([^\s]+(?=\.(jpg|jpeg|png|gif))\.\1)

它是如何匹配的?我很确定开始部分会去掉空格……还是这样?

谢谢。

4

2 回答 2

4

这两个是可怕的正则表达式。你在哪里找到他们?

首先,[^\s]+您可以简单地编写\S+(= 一个或多个非空白字符。),而不是 。

第二部分(?=\.(jpg|jpeg|png|gif))在字符串中向前看,以确保字符串的以下部分是一个点,后跟列出的图形文件扩展名之一。

然后,\.\2匹配完全相同的文本,使之前的前瞻断言完全没有意义。\2指第二对捕获括号的内容(即 周围的括号jpg|jpeg|png|gif)。

所以第一个正则表达式可以重写为

\S+\.(jpe?g|png|gif)

第二个永远不会匹配(并且会导致大多数(如果不是全部)编译器咳嗽和死亡),因为\1它指的是第一组括号的内容,它(完全无用)围绕整个正则表达式。当然,您不能将整个匹配作为其自身的一部分。

于 2012-08-24T20:07:58.010 回答
3
  • [^\s]+- 匹配 1 个或多个非空白字符;
  • (?=\.(jpg|jpeg|png|gif)- 零宽度(意味着它不消耗输入)正向前瞻,它断言在上述表达式之后,您有一个点 ( \.),然后是这四个图像扩展名之一;
  • \.\2- 匹配一个点,然后是第二个捕获的组,即(jpg|jpeg|png|gif).

总之,([^\s]+(?=\.(jpg|jpeg|png|gif))\.\2), 匹配 1 个一个或多个非空白字符(可能是文件名),后跟以下扩展名之一:.jpg.jpeg.png.gif.

第二个基本相同,但由于\1是指整个捕获的文本,它永远不会匹配任何内容。

于 2012-08-24T20:06:15.313 回答