这个正则表达式的含义是什么?

How*_*ard 0 regex perl

我有一个正则表达式定义跟随匹配http urls,任何人都可以帮助用英语解释?

^/foo/.*(?<!\.css|\.js|\.jpg)$
Run Code Online (Sandbox Code Playgroud)

Ama*_*dan 6

目录中/foo或下面的任何文件或目录css,jsjpg文件.

^        start of string anchor
/foo/    literal "/foo/"
.*       any number of characters
(?<!...) match from here backwards must fail:
  \.     dot
  css    literal "css"
  |      or
$        end of string anchor
Run Code Online (Sandbox Code Playgroud)

所以,字符串的开头/foo/,也许是其他一些字符,然后是字符串结尾 - 但就在之前,不能是.css,.js或者.jpg.

编辑:抱歉顽固.对于大多数引擎来说,它确实是一个无效的正则表达式,包括Perl.原因是,负面的背后必须有固定的宽度; 这个lookbehind可以是四个字符(如果是.jpg.css)或三个字符(.js).修复是在lookbehind中插入一个额外的"匹配任何东西",以便宽度始终为四:

^/foo/.*(?<!\.css|.\.js|\.jpg)$
Run Code Online (Sandbox Code Playgroud)

有了它,它的工作原理:

perl -e 'print "/foo/bar" =~ m[^/foo/.*(?<!\.css|.\.js|\.jpg)$];'
=> 1
Run Code Online (Sandbox Code Playgroud)

OP:你对regexpal.com的问题在于他们测试的是JavaScript正则表达式,它们根本没有实现负面的lookbehind.Regexp方言的细节不同.