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
.
结尾
我希望它匹配 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
.