我有一个正则表达式定义跟随匹配http urls,任何人都可以帮助用英语解释?
^/foo/.*(?<!\.css|\.js|\.jpg)$
Run Code Online (Sandbox Code Playgroud)
目录中/foo或下面的任何文件或目录css,js或jpg文件.
^ 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方言的细节不同.