我们说我有一个这样的字符串:
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()
迭代除最后一个之外的所有内容以更改名称。我该怎么做?
答案 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);