文字列を1回だけ分割するにはどうすればよいですか。つまり、次のように1|Ceci n'est pas une pipe: | Oui
解析します["1", "Ceci n'est pas une pipe: | Oui"]
。
分割の制限は役に立たないようです...
文字列を1回だけ分割するにはどうすればよいですか。つまり、次のように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('|')]);
components.splice(0,2).slice(0,2)
String.indexOf('|')
'|'の最初の出現のインデックスを取得するために使用したいと思います。
var i = s.indexOf('|');
var splits = [s.slice(0,i), s.slice(i+1)];
+1
、複数の文字がある場合は、実際には区切り文字列の長さである必要があることに注意してください。
var i = s.split('|',2).join('|').length;//2nd index
var splits = [s.slice(0,i).split('|'), s.slice(i+1)];
次を使用できます。
var splits = str.match(/([^|]*)\|(.*)/);
splits.shift();
正規表現は、文字列を2つの一致するグループ(括弧で囲まれた)に分割します。テキストは最初の|の前にあります。そして後のテキスト。次に、shift
結果として文字列の一致全体を削除します(splits[0]
)。
ワンライナーとイモ、よりシンプル:
var str = 'I | am super | cool | yea!';
str.split('|').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]
Pas de pipe?C'est null!
この返信を追加したのは、主にパイプシンボルを駄洒落にするためだけでなく、es6構文を披露するためでもあります。まだ多くの人がまだ使用していないのは驚くべきことです...
これを試して:
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"]
他の場所の商品に加えて、別の短いアプローチは、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/
ゼロの限界は面白い結果を返しますが、効率の名目で、私はそれのチェックを省略しました。必要に応じて、これを関数の最初の行として追加できます。
if(limit < 1) return [];
あなたが「パイプライン」を使いたいなら、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 != ''))
より効果的な方法:
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);