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

Javascript 正则表达式删除文件名中除扩展名以外的特殊字符,javascript,regex,Javascript,Regex,我需要从文件名中删除除扩展名以外的任何特殊字符 我使用javascriptfilename.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 结

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

我使用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


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

您可以使用
[^\w.]
删除除word和点字符以外的任何字符,以及字符串末尾未后跟1+非点字符的任何点:

filename = filename.replace(/(?:\.(?![^.]+$)|[^\w.])+/g, "-");

详细信息

  • (?:
    -启动非捕获组:
    • \.(?![^.]+$)
      -字符串末尾没有后跟1+非点字符的任何点
    • |
      -或
    • [^\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)最后一个有什么问题?文件名中当然可以有点。事实上,在文件
myArchive.tar.gz
中,扩展名是
tar.gz
。所以最后一个正则表达式似乎很好。您想做什么呢?问题是,最后一个跳过字符串中的任何点,而不仅仅是与扩展名相关的点。我知道有两个点的扩展名,但这种情况是针对媒体文件的,我没有任何具有这种扩展名的文件。我尝试使用带下划线的字符串,但没有检测到下划线,但应该用/w来检测,对吗?@RicardoA
\w
与单词char不匹配。它与
\u
不匹配,因为它是单词char。若要替换下划线,请使用
。将(/[\W\u]+/g,“-”)替换为第二个和第三个解决方案。对于第一个,使用
/|(?:\。(?![^.]+$)|[^\w.])+/g
Hmm谢谢!,我喜欢第一个,看起来更干净,都是一行完成的。