Обрезка строки при n-м появлении символа - PullRequest
43 голосов
/ 31 марта 2011

Что я хочу сделать, это взять строку, такую ​​как this.those.that, и получить подстроку в или из n-го вхождения символа. Таким образом, от начала строки до 2-го вхождения . вернет this.those. Аналогично, от 2-го вхождения . до конца строки будет возвращено that. Извините, если мой вопрос туманный, это не так легко объяснить. Также, пожалуйста, не предлагайте создавать дополнительные переменные, и результат будет в строке, а не в массиве.

Ответы [ 5 ]

76 голосов
/ 31 марта 2011

Вы можете сделать это без массивов, но это займет больше кода и будет менее читабельным.

Как правило, для выполнения работы требуется использовать только столько кода, а это также повышает удобочитаемость.Если вы обнаружите, что эта задача становится проблемой производительности (сравните ее), , затем вы можете начать рефакторинг для повышения производительности.

var str = 'this.those.that',
    delimiter = '.',
    start = 1,
    tokens = str.split(delimiter).slice(start),
    result = tokens.join(delimiter); // those.that

jsFiddle .

4 голосов
/ 18 октября 2013

Попробуйте это:

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

"qwe.fs.xczv.xcv.xcv.x".replace(/([^\.]*\.){**nth**}/, ''); - где nth - количество вхождений для удаления.

3 голосов
/ 25 января 2016

На всякий случай, если кому-то нужны оба слова "this" и "that.that" так, как Алекс описал в своем комментарии , вот модифицированный код:

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;
3 голосов
/ 31 марта 2011

Я озадачен тем, почему вы хотите делать что-то чисто со строковыми функциями, но я думаю, вы могли бы сделать что-то вроде следующего:

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

Однако я бы настоятельно рекомендовал что-то вроде гораздо более простого кода Алекса.

1 голос
/ 31 марта 2011

Если вы действительно хотите придерживаться строковых методов, тогда:

// 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;
}
...