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

时间:2015-02-13 16:42:58

标签: javascript loops replace each

我们说我有一个这样的字符串:

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()迭代除最后一个之外的所有内容以更改名称。我该怎么做?

4 个答案:

答案 0 :(得分:6)

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

正则表达式/\.(?=.*\.)/g查找句点,但仅限于后续某个时段的某个位置,这意味着最后一个句点不匹配。

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

  alert(result);
}

答案 1 :(得分:1)

考虑在'.'上拆分字符串,然后使用'_'重新加入除{}之外的所有字符串:



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);




答案 2 :(得分:1)

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



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




这匹配一个点后跟('除了点'和另一个点之外的任何东西),只替换组外的内容

答案 3 :(得分:0)

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);