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

时间:2017-09-25 10:22:14

标签: javascript regex negative-lookbehind

我想让它匹配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。问题是关于不能编写代码的情况,只指定正则表达式。

2 个答案:

答案 0 :(得分:1)

我想我会做这样的事情:

rate2

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

RegExp首先匹配路径中的最后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(技术上匹配任何斜杠,但后面的代码确保不能有另一个)。然后,它使用否定前瞻检查是否未匹配任何排除的文件。需要将前瞻锚定到字符串的末尾,以确保它不会过于慷慨地排除。在前瞻之后,它只消耗尽可能多的“非斜线”(即文件名),然后检查所有内容是否以/结束。

答案 1 :(得分:0)

这是我的解决方案:

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

如果您了解更好/可读的方式,请随时发布您的答案。