Cutting a string at nth occurrence of a character

后端 未结 5 492
南方客
南方客 2020-11-27 04:01

What I want to do is take a string such as this.those.that and get a substring to or from the nth occurrence of a character. So, from the start of the string to

相关标签:
5条回答
  • 2020-11-27 04:20

    Just in case somebody needs both "this" and "those.that" in a way as alex described in his comment, here is a modified code:

    var str = 'this.those.that',
        delimiter = '.',
        start = 1,
        tokens = str.split(delimiter),
          result = [tokens.slice(0, start), tokens.slice(start)].map(function(item) {
        return item.join(delimiter);
      }); // [ 'this', 'those.that' ] 
    
    document.body.innerHTML = result;

    0 讨论(0)
  • 2020-11-27 04:29

    If you really want to stick to string methods, then:

    // Return a substring of s upto but not including
    // the nth occurence of c
    function getNth(s, c, n) {
      var idx;
      var i = 0;
      var newS = '';
      do {
        idx = s.indexOf(c);
        newS += s.substring(0, idx);
        s = s.substring(idx+1);
      } while (++i < n && (newS += c))
      return newS;
    }
    
    0 讨论(0)
  • 2020-11-27 04:31

    You could do it without arrays, but it would take more code and be less readable.

    Generally, you only want to use as much code to get the job done, and this also increases readability. If you find this task is becoming a performance issue (benchmark it), then you can decide to start refactoring for performance.

    var str = 'this.those.that',
        delimiter = '.',
        start = 1,
        tokens = str.split(delimiter).slice(start),
        result = tokens.join(delimiter); // those.that
        
    console.log(result)
    
    // To get the substring BEFORE the nth occurence
    var tokens2 = str.split(delimiter).slice(0, start),
        result2 = tokens2.join(delimiter); // this
    
    console.log(result2)

    jsFiddle.

    0 讨论(0)
  • 2020-11-27 04:33

    Try this :

    "qwe.fs.xczv.xcv.xcv.x".replace(/([^\.]*\.){3}/, '');
    "xcv.xcv.x"
    

    "qwe.fs.xczv.xcv.xcv.x".replace(/([^\.]*\.){**nth**}/, ''); - where is nth is the amount of occurrence to remove.

    0 讨论(0)
  • 2020-11-27 04:34

    I'm perplexed as to why you want to do things purely with string functions, but I guess you could do something like the following:

    //str       - the string
    //c         - the character or string to search for
    //n         - which occurrence
    //fromStart - if true, go from beginning to the occurrence; else go from the occurrence to the end of the string
    var cut = function (str, c, n, fromStart) {
        var strCopy = str.slice(); //make a copy of the string
        var index;
        while (n > 1) {
            index = strCopy.indexOf(c)
            strCopy = strCopy.substring(0, index)
            n--;
        }
    
        if (fromStart) {
            return str.substring(0, index);
        } else {
            return str.substring(index+1, str.length);
        }
    }
    

    However, I'd strongly advocate for something like alex's much simpler code.

    0 讨论(0)
提交回复
热议问题