Remove all occurrences except last?

后端 未结 9 1566
深忆病人
深忆病人 2020-12-03 07:06

I want to remove all occurrences of substring = . in a string except the last one.

E.G:

1.2.3.4

should become:

相关标签:
9条回答
  • 2020-12-03 07:42

    var s='1.2.3.4';

    s=s.split('.');
    s.splice(s.length-1,0,'.');
    s.join('');
    

    123.4

    0 讨论(0)
  • 2020-12-03 07:44

    Found a much better way of doing this. Here is replaceAllButLast and appendAllButLast as they should be done. The latter does a replace whilst preserving the original match. To remove, just replace with an empty string.

    var str = "hello there hello there hello there"
    
    function replaceAllButLast(str, regex, replace) {
      var reg = new RegExp(regex, 'g')
      return str.replace(reg, function(match, offset, str) {
          var follow = str.slice(offset);
          var isLast = follow.match(reg).length == 1;
          return (isLast) ? match : replace
      })
    }
    
    function appendAllButLast(str, regex, append) {
      var reg = new RegExp(regex, 'g')
      return str.replace(reg, function(match, offset, str) {
          var follow = str.slice(offset);
          var isLast = follow.match(reg).length == 1;
          return (isLast) ? match : match + append
      })
    }
    
    var replaced = replaceAllButLast(str, / there/, ' world')
    console.log(replaced)
    
    var appended = appendAllButLast(str, / there/, ' fred')
    console.log(appended)

    Thanks to @leaf for these masterpieces which he gave here.

    0 讨论(0)
  • 2020-12-03 07:45
    function formatString() {
      var arr = ('1.2.3.4').split('.');
      var arrLen = arr.length-1;
      var outputString = '.' + arr[arrLen];
      for (var i=arr.length-2; i >= 0; i--) {
         outputString = arr[i]+outputString;
      }
      alert(outputString);
    }
    

    See it in action here: http://jsbin.com/izebay

    0 讨论(0)
  • 2020-12-03 07:50

    You could take a positive lookahead (for keeping the last dot, if any) and replace the first coming dots.

    var string = '1.2.3.4';
    
    console.log(string.replace(/\.(?=.*\.)/g, ''));

    0 讨论(0)
  • 2020-12-03 07:53

    2-liner:

    function removeAllButLast(string, token) {
        /* Requires STRING not contain TOKEN */
        var parts = string.split(token);
        return parts.slice(0,-1).join('') + token + parts.slice(-1)
    }
    

    Alternative version without the requirement on the string argument:

    function removeAllButLast(string, token) {
        var parts = string.split(token);
        if (parts[1]===undefined)
            return string;
        else
            return parts.slice(0,-1).join('') + token + parts.slice(-1)
    }
    

    Demo:

    > removeAllButLast('a.b.c.d', '.')
    "abc.d"
    

    The following one-liner is a regular expression that takes advantage of the fact that the * character is greedy, and that replace will leave the string alone if no match is found. It works by matching [longest string including dots][dot] and leaving [rest of string], and if a match is found it strips all '.'s from it:

    'a.b.c.d'.replace(/(.*)\./, x => x.replace(/\./g,'')+'.')
    

    (If your string contains newlines, you will have to use [.\n] rather than naked .s)

    0 讨论(0)
  • 2020-12-03 07:55

    You can use regex with positive look ahead,

    "1.2.3.4".replace(/[.](?=.*[.])/g, "");
    
    0 讨论(0)
提交回复
热议问题