Javascript 匹配具有特定扩展名的文件的正则表达式,但某些特定文件名除外

Javascript regular expression that matches files with particular extension except for some specific filenames

我希望它匹配 css 个文件的所有路径,除了一些特定的文件名 (file.css):

var re = /.../;
console.log(re.test('/path/to/file.css')); // false
console.log(re.test('/path/to/file.js')); // false
console.log(re.test('/path/to/file2.js')); // false
console.log(re.test('/path/to/e.css')); // true
console.log(re.test('/path/to/other-file.css')); // true
console.log(re.test('/path/to/file2.css')); // true

那么,如果我也想排除 asdfg.css 怎么办?

P.S。问题是不会写代码,只能指定正则表达式的情况。

这是我的解决方案:

var re = /\/(.{0,3}|(?!file).{4}|[^/]{5,})\.css$/;
console.log(re.test('/path/to/file.css')); // false
console.log(re.test('/path/to/file.js')); // false
console.log(re.test('/path/to/e.css')); // true
console.log(re.test('/path/to/other-file.css')); // true

还有两个文件:

var re = /\/(.{0,3}|(?!file).{4}|(?!asdfg).{5}|[^/]{6,})\.css$/;
console.log(re.test('/path/to/file.css')); // false
console.log(re.test('/path/to/asdfg.css')); // false
console.log(re.test('/path/to/file.js')); // false
console.log(re.test('/path/to/e.css')); // true
console.log(re.test('/path/to/other-file.css')); // true

如果您知道任何 better/readable 方法,请随时 post 您的答案。

我想我会这样做:

var re = /\/(?!(file|asdfg)\.css$)[^\/]*\.css$/;

console.log(re.test('/path/to/file.css')); // false
console.log(re.test('/path/to/file.js')); // false
console.log(re.test('/path/to/file2.js')); // false
console.log(re.test('/path/to/e.css')); // true
console.log(re.test('/path/to/other-file.css')); // true
console.log(re.test('/path/to/file2.css')); // true
console.log(re.test('/path/to/asdfg.css')); // false
console.log(re.test('/path/to/file/file2.css')); // true
console.log(re.test('/path/to/file.css/file2.css')); // true

我认为这更具可读性,因为排除列表是一​​个简单的交替,可以很容易地扩展以包含其他文件,而无需考虑其他因素(例如它们的长度)。

RegExp 从匹配路径中的最后一个 / 开始(技术上匹配任何斜杠,但后面的代码确保不会有另一个斜杠)。然后,它使用否定先行检查排除的文件中的 none 个是否匹配。前瞻需要锚定到字​​符串的末尾,以确保它不会过于慷慨地排除。在前瞻之后,它简单地消耗尽可能多的 'non-slashes'(即文件名),然后检查所有内容是否以 .css.

结尾