代码之家  ›  专栏  ›  技术社区  ›  x-yuri

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

  •  0
  • x-yuri  · 技术社区  · 8 年前

    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

    2 回复  |  直到 8 年前
        1
  •  1
  •   skirtle    8 年前

    我想我应该这样做:

    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从匹配final开始 / 在路径中(从技术上讲,它匹配任何斜杠,但后面的代码确保不会有另一个斜杠)。然后使用负前瞻检查排除的文件是否匹配。前瞻需要锚定到字符串的末尾,以确保它不会过于频繁地排除。在向前看之后,它只需要使用尽可能多的“非斜杠”(即文件名),然后检查所有内容是否以 .css

        2
  •  0
  •   x-yuri    8 年前

    以下是我的解决方案:

    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
    

    如果你知道任何更好/可读的方法,请随时发布你的答案。