如何遍历字符串并替换除最后一个句点以外的所有句点?

How can I loop through string and replace all periods except the last one?

假设我有这样一个字符串:

var test = my.long.file.name.zip

我用 javascript 得到这个字符串中的句点总数,如下所示:

var dots = (test.match(/\./g) || []).length;

如果字符串中有多个句点,我想用下划线替换字符串中的所有句点。

   if(dots>"1"){   
     var newname = test.replace(/\./g, "_");
     console.log(newname);
    }

问题是这会替换所有句点。我想保持最后一个完好无损。所以我希望 newname 变量按原样读取:

my_long_file_name.zip

我的猜测是我应该使用 $.each() 以某种方式遍历除最后一个以外的所有内容以更改名称。我应该怎么做?

考虑在 '.' 上拆分字符串,然后用 '_' 重新加入除最后一个以外的所有字符串:

var test = "my.long.file.name.zip";

parts = test.split('.');

var plen = parts.length;

if (plen > 1) {
  test = parts.slice(0, plen - 1).join('_') +
    "." +
    parts[plen - 1];
}

console.log(test);

正则表达式中的前瞻组将起作用:

var test = 'my.long.file.name.zip';
var result = test.replace(/\.(?=[^.]*\.)/g, '_');
alert(result);

这匹配一个点后跟('anything but dot' 和另一个点),仅替换组外的内容

您不一定需要循环,您可以使用更复杂的正则表达式来实现,它使用 positive lookahead

正则表达式 /\.(?=.*\.)/g 查找句点,但仅在更远的地方有后续句点的地方,这意味着最后一个句点不匹配。

window.onload = function(){
  var input = "my.long.file.name.zip"
  var result = input.replace(/\.(?=.*\.)/g,'_')

  alert(result);
}

var test = 'my.long.file.name.zip';
var last_index = test.lastIndexOf('.');
var newname = test;

if (-1 !== last_index) {
  newname = test.replace(/\./g, '_');
  newname = newname.substring(0, last_index).concat('.', newname.substring(last_index + 1));
}

console.log(newname);