Что я хочу сделать, это взять строку, такую как this.those.that
, и получить подстроку в или из n-го вхождения символа. Итак, с начала строки до второго вхождения .
вернется this.those
. Аналогично, из второго вхождения .
в конец строки вернется that
. Извините, если мой вопрос туманный, это не так просто объяснить. Кроме того, не рекомендуется делать дополнительные переменные, и результат будет в строке, а не в массиве.
Вырезание строки в n-м вводе символа
Ответ 1
Вы можете сделать это без массивов, но это займет больше кода и будет менее читабельным.
Как правило, вы просто хотите использовать как можно больше кода для выполнения работы, и это также повышает удобочитаемость. Если вы обнаружите, что эта задача становится проблемой производительности (сравните ее), вы можете начать рефакторинг для повышения производительности.
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)
Ответ 2
Попробуйте следующее:
"qwe.fs.xczv.xcv.xcv.x".replace(/([^\.]*\.){3}/, '');
"xcv.xcv.x"
"qwe.fs.xczv.xcv.xcv.x".replace(/([^\.]*\.){**nth**}/, '');
- где nth - количество случаев, которое нужно удалить.
Ответ 3
Я недоумеваю, почему вы хотите делать что-то чисто с строковыми функциями, но я думаю, вы могли бы сделать что-то вроде следующего:
//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);
}
}
Однако я бы решительно выступал за нечто вроде alex гораздо более простого кода.
Ответ 4
На всякий случай кому-то нужны как "this", так и "те .that" таким образом, как alex, описанный в его комментарии , здесь приведен модифицированный код:
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;
Ответ 5
Если вы действительно хотите придерживаться строковых методов, то:
// 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;
}