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


82

文字列を1回だけ分割するにはどうすればよいですか。つまり、次のように1|Ceci n'est pas une pipe: | Oui解析します["1", "Ceci n'est pas une pipe: | Oui"]

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

回答:


79

これはかなりのアプローチではありませんが、まともな効率で機能します。

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

これがその簡単なデモです


これは実際には正規表現よりも優れていると思います。正解に選ばれました、ありがとう!
Stavros Korokithakis 2010年

2
明確にするために、彼はN個の部分に分割し、最初の部分をリストにポップし、残りを同じリストに結合しています。
Stavros Korokithakis 2010年

1ではなく文字列からk個のトークンを取得する場合は、components.shift()の代わりにcomponents.splice(0、k)を使用することを除いて、上記と同じようにします。
d Coetzee 2013

2つの以上のチャックでこれを行う方法を疑問に思う人のために、あなたがループ内でシフトを使用することができますか:components.splice(0,2).slice(0,2)
Ultimater

114

String.indexOf('|')'|'の最初の出現のインデックスを取得するために使用したいと思います。

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

18
Nickほど「楽しい」わけではありませんが、おそらくもっと効率的です。また+1、複数の文字がある場合は、実際には区切り文字列の長さである必要があることに注意してください。
devios1 2012

このソリューションが「面白くない」のはなぜですか?
Bentley4 2014年

2つの以上のチャンクでこれを行うには、不思議に思ったものについては、あなたがループ内でのindexOfを使用することができますか:var i = s.split('|',2).join('|').length;//2nd index var splits = [s.slice(0,i).split('|'), s.slice(i+1)];
Ultimater

6
これは、IndexOfが-1を返す場合、splitのようには機能しません(たとえば、var s = 'string'の場合、['strin'、 'string']を返します)。条件文を書く必要があります。
JJJ 2015年

14

次を使用できます。

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

正規表現は、文字列を2つの一致するグループ(括弧で囲まれた)に分割します。テキストは最初の|の前にあります。そして後のテキスト。次に、shift結果として文字列の一致全体を削除します(splits[0])。


1
適切に、それはおそらく最初に固定する必要があります。ただし、javascriptregexenは貪欲なようです。
muhmuhten 2010年

6

ワンライナーとイモ、よりシンプル:

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

これは「スーパー|クール|イェーイ!」を返します。


4
これは求められたものではなく、不足している最初の部分も探しています。
SmujMaiku 2017年

6

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]

Pas de pipe?C'est null!

この返信を追加したのは、主にパイプシンボルを駄洒落にするためだけでなく、es6構文を披露するためでもあります。まだ多くの人がまだ使用していないのは驚くべきことです...


3

これを試して:

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

文字列に区切り文字が含まれていない場合でも、@ 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"]

1

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

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

0

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

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

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


これは、「一意の」フレーズが入力できない場合にのみ機能します。テキストファイルから読み取る場合、これは不可能です。ブラウザから読み取る場合、おそらく問題がなければ、印刷できない制御文字。タブも不思議に機能します。いずれにせよ、「aUniquePhraseToSaySplitMe」はほぼ間違いなく入力の一部であるため、危険です。
muhmuhten 2010年

もちろん、あなたは正しいです。私の例は、何が行われているのかを簡潔に説明することを目的とした単なる例です。私はあなたのポイントを答え自体に取り入れます。ありがとう!

独自のフレーズにstrを使用すると、それが再び存在することはありません。:evil grin
Fabio Beltramini 2015年

0

これは少し長いですが、制限が必要だと私が信じているように機能します:

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/

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

if(limit < 1) return [];

0

あなたが「パイプライン」を使いたいなら、reduceあなたの友達です

const separator = '|'
jsonNode.split(separator)
   .reduce((previous, current, index) =>
    {
        if (index < 2) previous.push(current)
        else previous[1] += `${separator}${current}`
        return previous
    }, [])
    .map((item: string) => (item.trim()))
    .filter((item: string) => (item != ''))

0

より効果的な方法:

const str = "1|Ceci n'est pas une pipe: | Oui"

const [head] = str.split('|', 1);

const result = [head, str.substr(head.length + 1)]

console.log(result);


-1

javascript正規表現機能を使用して、最初にキャプチャされた式を取得します。

REはおそらくのようになり/^([^|]*)\|/ます。

実際には、/[^|]*/javascriptの正規表現の貪欲さのために、文字列がそのような方法でフォーマットされていることを検証した場合にのみ必要です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.