Вы можете удалить любые символы, кроме символов слова и точки, с помощью [^\w.]
, а любую точку, за которой не следует 1+ без точек в конце строки:
filename = filename.replace(/(?:\.(?![^.]+$)|[^\w.])+/g, "-");
См. regex demo
Подробности
(?:
- начало группы без захвата: \.(?![^.]+$)
-любая точка, за которой не следует 1+ не точечных символов в конце строки |
- или [^\w.]
- любой символ, кроме слова char и dot char
)+
- конец группы, повторите 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
.
Или, если расширения являются необязательными, разделяйте их с помощьюпоследнюю точку замените, как в предыдущем решении, и присоединитесь назад:
var filename = "manuel fernandex – Index Prot.bla.otype 5 (pepito grillo).jpg";
var parts = filename.split(/\.(?=[^.]*$)/);
parts[0] = parts[0].replace(/\W+/g, "-");
console.log(parts.join("."));