【问题标题】:How can I loop through string and replace all periods except the last one?如何遍历字符串并替换除最后一个句点之外的所有句点?
【发布时间】:2015-04-14 18:46:09
【问题描述】:

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

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() 以某种方式遍历所有内容,除了最后一个来更改名称。我该怎么做?

【问题讨论】:

  • 这与 jQuery 无关——它是原生的 javascript,所以我更新了你的问题。
  • 好的,谢谢。我只是在 jQuery 函数中执行此操作,所以我专注于此。

标签: javascript loops replace each


【解决方案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】:

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

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

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

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

      • 这赢得了最简洁的代码和易于理解的解释。谢谢。
      • 另外"my.long.....file.name.zip".replace(/\.{1,}(?=.*\.)/g,'_') 仅用一个下划线替换点序列:"my_long_file_name.zip"
      【解决方案4】:
      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);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-08-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-02-12
        • 1970-01-01
        相关资源
        最近更新 更多