web-dev-qa-db-ja.com

文字のn番目の出現で文字列を切り取る

私がやりたいのは、this.those.thatなどの文字列を取得し、文字のn番目の出現との間で部分文字列を取得することです。したがって、文字列の先頭から2番目の.の出現までは、this.thoseを返します。同様に、2番目の.の出現から文字列の最後まではthatを返します。私の質問がぼやけている場合は申し訳ありませんが、説明するのは簡単ではありません。また、追加の変数を作成することを提案しないでください。結果は配列ではなく文字列になります。

44
Anonymous

配列なしでも実行できますが、より多くのコードが必要になり、読みにくくなります。

一般に、ジョブを完了するためにできるだけ多くのコードを使用したいだけであり、これにより読みやすさが向上します。このタスクがパフォーマンスの問題になっている場合(ベンチマーク)、thenパフォーマンスのリファクタリングを開始することを決定できます。

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

78
alex

これを試して :

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

"qwe.fs.xczv.xcv.xcv.x".replace(/([^\.]*\.){**nth**}/, '');-nthは削除するオカレンスの量です。

4
user2165842

純粋に文字列関数で何かをしたい理由については困惑していますが、次のようなことができると思います:

//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のはるかに単純なコードのようなものを強く推奨します。

3
NT3RP

アレックスが comment で説明したように、誰かが "this"と "those.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
hooke

本当に文字列メソッドに固執したい場合:

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