正则表达式删除文件名中的特殊字符(扩展名除外)

时间:2019-02-21 10:21:11

标签: javascript regex

除了扩展名,我需要从文件名中删除任何特殊字符。

我正在使用JavaScript filename.replace(regex, '-');

原始文件名:manuel fernandex – Index Prot.bla.otype 5 (pepito grillo).jpg

目标文件名:manuel-fernandex-Index-Prot-bla-otype-5-pepito-grillo-.jpg

有了这个,我得到了块中的任何特殊字符,正是我所需要的,但是需要跳过文件名的扩展名:

/[^\w\d]+/g 结果:manuel-fernandex-Index-Prot-bla-otype-5-pepito-grillo-jpg

对于这个,我删除了文件名以外的任何特殊字符,但也将所有点保留在文件名中:

[^\d\w\_\-\.]+ 结果:manuel-fernandex-Index-Prot.bla.otype-5-pepito-grillo.jpg

我非常接近,但我找不到最终的解决方案。

1 个答案:

答案 0 :(得分:1)

您可以使用diff --git a/tests/test-string-output-visitor.c b/tests/test-string-output-visitor.c index 101fb27..fd5e67b 100644 --- a/tests/test-string-output-visitor.c +++ b/tests/test-string-output-visitor.c @@ -248,39 +248,39 @@ int main(int argc, char **argv) output_visitor_test_add("/string-visitor/output/int", &out_visitor_data, test_visitor_out_int, false); - output_visitor_test_add("/string-visitor/output/int", + output_visitor_test_add("/string-visitor/output/int-human", &out_visitor_data, test_visitor_out_int, true); output_visitor_test_add("/string-visitor/output/bool", &out_visitor_data, test_visitor_out_bool, false); - output_visitor_test_add("/string-visitor/output/bool", + output_visitor_test_add("/string-visitor/output/bool-human", &out_visitor_data, test_visitor_out_bool, true); output_visitor_test_add("/string-visitor/output/number", &out_visitor_data, test_visitor_out_number, false); - output_visitor_test_add("/string-visitor/output/number", + output_visitor_test_add("/string-visitor/output/number-human", &out_visitor_data, test_visitor_out_number, true); output_visitor_test_add("/string-visitor/output/string", &out_visitor_data, test_visitor_out_string, false); - output_visitor_test_add("/string-visitor/output/string", + output_visitor_test_add("/string-visitor/output/string-human", &out_visitor_data, test_visitor_out_string, true); output_visitor_test_add("/string-visitor/output/no-string", &out_visitor_data, test_visitor_out_no_string, false); - output_visitor_test_add("/string-visitor/output/no-string", + output_visitor_test_add("/string-visitor/output/no-string-human", &out_visitor_data, test_visitor_out_no_string, true); output_visitor_test_add("/string-visitor/output/enum", &out_visitor_data, test_visitor_out_enum, false); - output_visitor_test_add("/string-visitor/output/enum", + output_visitor_test_add("/string-visitor/output/enum-human", &out_visitor_data, test_visitor_out_enum, true); output_visitor_test_add("/string-visitor/output/enum-errors", &out_visitor_data, test_visitor_out_enum_errors, false); - output_visitor_test_add("/string-visitor/output/enum-errors", + output_visitor_test_add("/string-visitor/output/enum-errors-human", &out_visitor_data, test_visitor_out_enum_errors, true); output_visitor_test_add("/string-visitor/output/intList", &out_visitor_data, test_visitor_out_intList, false); - output_visitor_test_add("/string-visitor/output/intList", + output_visitor_test_add("/string-visitor/output/intList-human", &out_visitor_data, test_visitor_out_intList, true); g_test_run(); 除去单词和点字符以外的所有字符,并在字符串末尾删除不带1+个非点字符的点。

[^\w.]

请参见regex demo

详细信息

  • filename = filename.replace(/(?:\.(?![^.]+$)|[^\w.])+/g, "-"); -一个非捕获组的开始:
    • (?:-字符串末尾没有后跟1+个非点字符的任何点
    • \.(?![^.]+$)-或
    • |-除单词char和点字符外的任何char
  • [^\w.]-组结束,重复1次或更多次。

另一个解决方案(如果始终存在扩展名):拆分扩展名,在第一个块上运行更简单的正则表达式,然后再加入:

)+

请注意,您的var filename = "manuel fernandex – Index Prot.bla.otype 5 (pepito grillo).jpg"; var ext = filename.substr(filename.lastIndexOf('.') + 1); var name = filename.substr(0, filename.lastIndexOf('.')); console.log(name.replace(/\W+/g, "-") + "." + ext);/[^\w\d]+/g等于/\W+/g包括\w

或者,如果扩展名是可选的,则用最后一个点分隔,替换为前面的解决方案,然后再加入:

\d