文字列を一度だけ分割する、つまりmake 1|Ceci n'est pas une pipe: | Oui
解析先:["1", "Ceci n'est pas une pipe: | Oui"]
?
分割の制限は役に立たないようです...
これはきれいなアプローチではありませんが、まともな効率で動作します:
var string = "1|Ceci n'est pas une pipe: | Oui";
var components = string.split('|');
alert([components.shift(), components.join('|')]);
String.indexOf('|')
を使用して、 '|'の最初の出現のインデックスを取得します。
var i = s.indexOf('|');
var splits = [s.slice(0,i), s.slice(i+1)];
次を使用できます。
var splits = str.match(/([^|]*)\|(.*)/);
splits.shift();
正規表現は、文字列を2つの一致するグループ(かっこ内)に分割します。そしてその後のテキスト。次に、 shift
文字列全体の一致を取り除くための結果(splits[0]
)。
1つのライナーとイモ、よりシンプルな:
var str = 'I | am super | cool | yea!';
str.split('|').slice(1).join('|');
これは、「am super | cool | yea!」を返します。
これを試して:
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", '|');
文字列に区切り文字が含まれていない場合、@ 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"]
これまでのほとんどの答えと同じくらい悪:
var splits = str.split('|');
splits.splice(1, splits.length - 1, splits.slice(1).join('|'));
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構文を披露することもできます-驚くほど多くの人々がまだそれを使用していない...
他の商品とは別の短いアプローチは、replace()
の制限をあなたの利点に使用することです。
var str = "1|Ceci n'est pas une pipe: | Oui";
str.replace("|", "aUniquePhraseToSaySplitMe").split("aUniquePhraseToSaySplitMe");
@sreservoirがコメントで指摘しているように、一意のフレーズは本当に一意である必要があります。この分割を実行しているソースに含めることはできません。彼が言うように、印刷できない文字は、ユーザー入力に対してこれを実行している場合(つまり、ブラウザーに入力された場合)に実行される可能性があります。
これはもう少し長くなりますが、制限は次のようにすべきだと思うように機能します:
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 [];