在第 n 个字符出现时切割字符串

IT技术 javascript string substring slice
2021-01-23 09:04:24

我想要做的是获取一个字符串,例如"this.those.that"并从第 n 个字符出现或从第 n 个字符中获取子字符串。因此,从字符串的开头到第二次出现.将返回"this.those". 同样,从 的第二次出现.到字符串的末尾将返回"that"对不起,如果我的问题是模糊的,那么解释起来并不容易。另外,请不要建议创建额外的变量,结果将是字符串而不是数组。

5个回答

您可以在没有数组的情况下执行此操作,但需要更多代码且可读性较差。

通常,您只想使用尽可能多的代码来完成工作,这也增加了可读性。如果您发现此任务正在成为一个性能问题(对其进行基准测试),那么您可以决定开始重构以提高性能。

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)

js小提琴

要获得“this.those”和“that”,请将 slice(start) 更改为 slice(0,start)
2021-03-19 09:04:24
我认为结果应该是“this.those”和“that”?
2021-03-20 09:04:24
通过在 split 中使用可选的限制参数更短: result = str.split(delimiter, start+1).join(delimiter)
2021-03-26 09:04:24
我希望有一种方法来喜欢这个答案!
2021-04-04 09:04:24
@tvanfosson 也许我误解了这个问题,但它被接受了:)
2021-04-06 09:04:24

试试这个 :

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

"qwe.fs.xczv.xcv.xcv.x".replace(/([^\.]*\.){**nth**}/, ''); - 其中 nth 是要删除的出现次数。

@killua8p 奇怪的推理。如果有时分隔符可能是正则表达式,您可以这样设计。如果要在字符串上拆分,您不应该总是喜欢正则表达式,因为您可能需要它亚格尼。
2021-03-15 09:04:24
这大约快 4 倍。
2021-03-29 09:04:24
这个比公认的答案要好。有时分隔符可以是正则表达式(例如\s+)。在这种情况下,接受的答案将不起作用。但是这个会。
2021-04-11 09:04:24

我很困惑为什么你想纯粹用字符串函数做事,但我想你可以做如下的事情:

//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 的简单得多的代码。

以防万一有人以亚历克斯在他的评论中描述的方式同时需要“这个”和“那些.那个” ,这里有一个修改后的代码:

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;

如果你真的想坚持使用字符串方法,那么:

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