web-dev-qa-db-ja.com

JS string.split()区切り文字を削除せずに

区切り文字を削除せずに文字列を分割するにはどうすればよいですか?

文字列があるとしましょう:_var string = "abcdeabcde";_

var newstring = string.split("d")を実行すると、次のようになります。

_["abc","eabc","e"]_

しかし、私はこれを取得したい:

_["abc","d","eabc","d","e"]_

「split2」関数を実行しようとすると、すべてsplice()とインデックス、「this」と「that」、そして...に絡まりました。助けて! :D

45
Martin Janiczek

これを試して:

  1. すべての「d」インスタンスを「、d」に置き換えます
  2. 「、」で分割
var string = "abcdeabcde";
var newstringreplaced = string.replace(/d/gi, ",d");
var newstring = newstringreplaced.split(",");
return newstring;

お役に立てれば。

20
InfoLearner

試してください:

"abcdeabcde".split(/(d)/);
47
Kai
var parts= string.split('d');
for (var i= parts.length; i-->1;)
    parts.splice(i, 0, 'd');

dsが既に挿入されているリストの部分にdsを追加しないようにするには、逆ループが必要です。)

18
bobince

カイの答え が好きですが、不完全です。代わりに使用します:

"abcdeabcde".split(/(?=d)/g) //-> ["abc", "deabc", "de"]

これは正規表現で Lookahead Zero-Length Assertion を使用しており、キャプチャグループの一部ではない一致を作成します。他のトリックや回避策は必要ありません。

16
micha

1行で実行できます。

var string = "abcdeabcde";    
string.split(/(d)/);
["abc", "d", "eabc", "d", "e"]
8
JonMayer

split-分割は、検索用ではなく個別の行を作成するために使用されます。

[^ d]-「d」を含まない部分文字列のグループを見つける

var str = "abcdeabcde";

str.match(/[^d]+|d/g)         // ["abc", "d", "eabc", "d", "e"]
or
str.match(/[^d]+/g)           // ["abc", "eabc", "e"]
or
str.match(/[^d]*/g)           // ["abc", "", "eabc", "", "e", ""]

「javascript」で問題が発生しないようにする場合は、「RegExpオブジェクト」をお読みください。

5
udn79

これは正規表現の区切り文字の私のバージョンです。 String.prototype.splitと同じインターフェイスがあります。グローバルと非グローバルの正規表現を違いなく扱います。返される値は、その奇数メンバーが区切り文字に一致する配列です。

function split(text, regex) {
    var token, index, result = [];
    while (text !== '') {
        regex.lastIndex = 0;
        token = regex.exec(text);
        if (token === null) {
            break;
        }
        index = token.index;
        if (token[0].length === 0) {
            index = 1;
        }
        result.Push(text.substr(0, index));
        result.Push(token[0]);
        index = index + token[0].length;
        text = text.slice(index);
    }
    result.Push(text);
    return result;
}

// Tests
assertEquals(split("abcdeabcde", /d/), ["abc", "d", "eabc", "d", "e"]);
assertEquals(split("abcdeabcde", /d/g), ["abc", "d", "eabc", "d", "e"]);
assertEquals(split("1.2,3...4,5", /[,\.]/), ["1", ".", "2", ",", "3", ".", "", ".", "", ".", "4", ",", "5"]);
assertEquals(split("1.2,3...4,5", /[,\.]+/), ["1", ".", "2", ",", "3", "...", "4", ",", "5"]);
assertEquals(split("1.2,3...4,5", /[,\.]*/), ["1", "", "", ".", "2", "", "", ",", "3", "", "", "...", "4", "", "", ",", "5", "", ""]);
assertEquals(split("1.2,3...4,5", /[,\.]/g), ["1", ".", "2", ",", "3", ".", "", ".", "", ".", "4", ",", "5"]);
assertEquals(split("1.2,3...4,5", /[,\.]+/g), ["1", ".", "2", ",", "3", "...", "4", ",", "5"]);
assertEquals(split("1.2,3...4,5", /[,\.]*/g), ["1", "", "", ".", "2", "", "", ",", "3", "", "", "...", "4", "", "", ",", "5", "", ""]);
assertEquals(split("1.2,3...4,5.", /[,\.]/), ["1", ".", "2", ",", "3", ".", "", ".", "", ".", "4", ",", "5", ".", ""]);
assertEquals(split("1.2,3...4,5.", /[,\.]+/), ["1", ".", "2", ",", "3", "...", "4", ",", "5", ".", ""]);
assertEquals(split("1.2,3...4,5.", /[,\.]*/), ["1", "", "", ".", "2", "", "", ",", "3", "", "", "...", "4", "", "", ",", "5", "", "", ".", ""]);
assertEquals(split("1.2,3...4,5.", /[,\.]/g), ["1", ".", "2", ",", "3", ".", "", ".", "", ".", "4", ",", "5", ".", ""]);
assertEquals(split("1.2,3...4,5.", /[,\.]+/g), ["1", ".", "2", ",", "3", "...", "4", ",", "5", ".", ""]);
assertEquals(split("1.2,3...4,5.", /[,\.]*/g), ["1", "", "", ".", "2", "", "", ",", "3", "", "", "...", "4", "", "", ",", "5", "", "", ".", ""]);

// quick and dirty assert check
function assertEquals(actual, expected) {
  console.log(JSON.stringify(actual) === JSON.stringify(expected));
}
2
Ebrahim Byagowi

これを試して:

var string = "abcdeabcde";
    var delim = "d";
    var newstring = string.split(delim);
    var newArr = [];
    var len=newstring.length;
    for(i=0; i<len;i++)
    {
        newArr.Push(newstring[i]);
        if(i != len-1)newArr.Push(delim);
    }
1
Chandu

これを試して

"abcdeabcde".split("d").reduce((result, value, index) => {
    return (index !== 0) ? result.concat(["d", value]) : result.concat(value)
}, [])
1
heesu Suh
function split2(original){
   var delimiter = "d", result = [], tmp;
   tmp = original.split(delimiter);
   tmp.forEach(function(x){result.Push(x); result.Push(delimiter); });
   return result;
}
0
pc1oad1etter

これで_String.prototype.split_関数をオーバーライドするだけです:

_String.prototype._split = String.prototype.split;
String.prototype.split = function(delimiter, keepDelimiters) {
    if (!keepDelimiters) {
        return this._split(delimiter);
    } else {
        var res = [];
        var start = 0, index;
        while ((index = this.indexOf(delimiter, start)) != -1) {
            res.Push(this.substr(start, index - start));
            res.Push(delimiter);
            start = index + 1;
        }
        res.Push(this.substr(start));
        return res;
    }
};


var str = "abcdeabcde";
alert(str.split("d", true));
alert(str.split("d"));

// output : 
//
//  [ 'abc', 'd', 'eabc', 'd', 'e' ]
//  [ 'abc', 'eabc', 'e' ]
_

このメソッドは失敗せず、正規表現を使用せず、元の_String.split_関数と一貫性があります。 str.split(/(d)/);ソリューションとも一致しますが、IEでは失敗しません。

唯一の制限は、2番目のパラメーター(split置換ドロップイン関数)を使用する場合、区切り文字を正規表現にできないことです。しかし、少し考えてみると、正規表現を使用する場合は2番目のパラメーターは必要ないため、実際の制限ではありません...

0
Yanick Rochon

これを試して

var string = "abcdeabcde";
var res = string.replace( /d/g, 'd\0' ).split(/(?=d)|\0/);
console.log( res );
//["abc", "d", "eabc", "d", "e"]
0
meouw