以下正则表达式匹配什么?

时间:2012-08-24 19:59:12

标签: regex

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

和这一个:

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

它是如何匹配的?我很确定起始部分剥离了白色空间......是吗?

感谢。

2 个答案:

答案 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指的是整个捕获的文本,它永远不会匹配任何东西。