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

Ric*_*ear 2 javascript regex

我需要从文件名中删除除扩展名之外的任何特殊字符。

\n\n

我使用的是javascriptfilename.replace(regex, '-');

\n\n

原始文件名:manuel fernandex \xe2\x80\x93 Index Prot.bla.otype 5 (pepito grillo).jpg

\n\n

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

\n\n

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

\n\n

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

\n\n

有了这个,我删除了除文件名之外的所有特殊字符,但也保留了文件名中的所有点:

\n\n

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

\n\n

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

\n

Wik*_*żew 5

您可以删除除单词和点字符之外的任何字符[^\\w.],以及在字符串末尾不跟随 1 个以上非点字符的任何点:

\n\n
filename = filename.replace(/(?:\\.(?![^.]+$)|[^\\w.])+/g, "-");\n
Run Code Online (Sandbox Code Playgroud)\n\n

请参阅正则表达式演示

\n\n

细节

\n\n
    \n
  • (?:- 非捕获组的开始:\n\n
      \n
    • \\.(?![^.]+$)- 字符串末尾没有跟随 1 个以上非点字符的任何点
    • \n
    • |- 或者
    • \n
    • [^\\w.]- 除字字符和点字符之外的任何字符
    • \n
  • \n
  • )+- 一组结束,重复1次或多次。
  • \n
\n\n

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

\n\n

\r\n
\r\n
filename = filename.replace(/(?:\\.(?![^.]+$)|[^\\w.])+/g, "-");\n
Run Code Online (Sandbox Code Playgroud)\r\n
\r\n
\r\n

\n\n

请注意您的/[^\\w\\d]+/g和与include/\\W+/g相等。\\w\\d

\n\n

或者,如果扩展是可选的,则用最后一个点分割,按照之前的解决方案进行替换,然后连接回来:

\n\n

\r\n
\r\n
var filename = "manuel fernandex \xe2\x80\x93 Index Prot.bla.otype 5 (pepito grillo).jpg";\r\nvar ext = filename.substr(filename.lastIndexOf(\'.\') + 1);\r\nvar name = filename.substr(0, filename.lastIndexOf(\'.\')); \r\nconsole.log(name.replace(/\\W+/g, "-") + "." + ext);
Run Code Online (Sandbox Code Playgroud)\r\n
\r\n
\r\n

\n