web-dev-qa-db-ja.com

javascriptで文字列を1回分割しますか?

文字列を一度だけ分割する、つまりmake 1|Ceci n'est pas une pipe: | Oui解析先:["1", "Ceci n'est pas une pipe: | Oui"]

分割の制限は役に立たないようです...

71

これはきれいなアプローチではありませんが、まともな効率で動作します:

var string = "1|Ceci n'est pas une pipe: | Oui";
var components = string.split('|');
alert([components.shift(), components.join('|')]​);​​​​​

ここに簡単なデモがあります

72
Nick Craver

String.indexOf('|')を使用して、 '|'の最初の出現のインデックスを取得します。

var i = s.indexOf('|');
var splits = [s.slice(0,i), s.slice(i+1)];
102
yarmiganosca

次を使用できます。

var splits = str.match(/([^|]*)\|(.*)/);
splits.shift();

正規表現は、文字列を2つの一致するグループ(かっこ内)に分割します。そしてその後のテキスト。次に、 shift 文字列全体の一致を取り除くための結果(splits[0])。

14

1つのライナーとイモ、よりシンプルな:

var str = 'I | am super | cool | yea!';
str.split('|').slice(1).join('|');

これは、「am super | cool | yea!」を返します。

6
Hassek

これを試して:

function splitOnce(input, splitBy) {
    var fullSplit = input.split(splitBy);
    var retVal = [];
    retVal.Push( fullSplit.shift() );
    retVal.Push( fullSplit.join( splitBy ) );
    return retVal;
}

var whatever = splitOnce("1|Ceci n'est pas une pipe: | Oui", '|');
3
Josh the Goods

文字列に区切り文字が含まれていない場合、@ NickCraverのソリューションは2つの要素の配列を返しますが、2番目は空の文字列です。分割の動作と一致する動作を好みます。つまり、入力文字列に区切り文字が含まれていない場合、単一の要素を持つ配列のみが返されます。

var splitOnce = function(str, delim) {
    var components = str.split(delim);
    var result = [components.shift()];
    if(components.length) {
        result.Push(components.join(delim));
    }
    return result;
};

splitOnce("a b c d", " "); // ["a", "b c d"]
splitOnce("a", " "); // ["a"]
3
Raine Revere

これまでのほとんどの答えと同じくらい悪:

var splits = str.split('|');
splits.splice(1, splits.length - 1, splits.slice(1).join('|'));
1
wombleton

ES6構文では、異なるアプローチが可能です。

function splitOnce(s, on) {
   [first, ...rest] = s.split(on)
   return [first, rest.length > 0? rest.join(on) : null]
}

また、より明示的な空の文字列ではなくnullを返すことにより、|を持たない文字列の結果を処理します。

splitOnce("1|Ceci n'est pas une pipe: | Oui", "|")
>>> ["1", "Ceci n'est pas une pipe: | Oui"]

splitOnce("Celui-ci n'a pas de pipe symbol!", "|")
>>> ["Celui-ci n'a pas de pipe symbol!", null]

パス・ド・パイプ?ヌルヌル!

私は主にこの返信を追加したので、パイプ記号をしゃべるだけでなく、es6構文を披露することもできます-驚くほど多くの人々がまだそれを使用していない...

1
andyhasit

他の商品とは別の短いアプローチは、replace()の制限をあなたの利点に使用することです。

var str = "1|Ceci n'est pas une pipe: | Oui";
str.replace("|", "aUniquePhraseToSaySplitMe").split("aUniquePhraseToSaySplitMe");

@sreservoirがコメントで指摘しているように、一意のフレーズは本当に一意である必要があります。この分割を実行しているソースに含めることはできません。彼が言うように、印刷できない文字は、ユーザー入力に対してこれを実行している場合(つまり、ブラウザーに入力された場合)に実行される可能性があります。

0
D_N

これはもう少し長くなりますが、制限は次のようにすべきだと思うように機能します:

function split_limit(inString, separator, limit){
    var ary = inString.split(separator);
    var aryOut = ary.slice(0, limit - 1);
    if(ary[limit - 1]){
        aryOut.Push(ary.slice(limit - 1).join(separator));
    }
    return aryOut;
}
console.log(split_limit("1|Ceci n'est pas une pipe: | Oui","|", 1));
console.log(split_limit("1|Ceci n'est pas une pipe: | Oui","|", 2));
console.log(split_limit("1|Ceci n'est pas une pipe: | Oui","|", 3));
console.log(split_limit("1|Ceci n'est pas une pipe: | Oui","|", 7));

https://jsfiddle.net/2gyxuo2j/

limit of Zeroは面白い結果を返しますが、効率性の名目で、私はそれのチェックを省略しました。必要に応じて、これを関数の最初の行として追加できます。

if(limit < 1) return [];
0
alfadog67