web-dev-qa-db-ja.com

スペースまたは配列への引用符でのJavascript分割文字列

var str = 'single words "fixed string of words"';
var astr = str.split(" "); // need fix

配列を次のようにしたいと思います。

var astr = ["single", "words", "fixed string of words"];
27
Remi
str.match(/\w+|"[^"]+"/g)

//single, words, "fixed string of words"
28
YOU

受け入れられた答えは完全に正しいわけではありません。のような非スペース文字で区切ります。および-そして結果に引用符を残します。引用符を除外するようにこれを行うためのより良い方法は、次のようにグループをキャプチャすることです。

//The parenthesis in the regex creates a captured group within the quotes
var myRegexp = /[^\s"]+|"([^"]*)"/gi;
var myString = 'single words "fixed string of words"';
var myArray = [];

do {
    //Each call to exec returns the next regex match as an array
    var match = myRegexp.exec(myString);
    if (match != null)
    {
        //Index 1 in the array is the captured group if it exists
        //Index 0 is the matched text, which we use if no captured group exists
        myArray.Push(match[1] ? match[1] : match[0]);
    }
} while (match != null);

myArrayには、OPが要求したものが正確に含まれるようになります。

single,words,fixed string of words
21
dallin

これは、分割と正規表現のマッチングを組み合わせて使用​​します。

var str = 'single words "fixed string of words"';
var matches = /".+?"/.exec(str);
str = str.replace(/".+?"/, "").replace(/^\s+|\s+$/g, "");
var astr = str.split(" ");
if (matches) {
    for (var i = 0; i < matches.length; i++) {
        astr.Push(matches[i].replace(/"/g, ""));
    }
}

これにより、期待される結果が返されますが、1つの正規表現ですべてを実行できるはずです。

// ["single", "words", "fixed string of words"]

更新そしてこれはS.Markによって提案された方法の改良版です

var str = 'single words "fixed string of words"';
var aStr = str.match(/\w+|"[^"]+"/g), i = aStr.length;
while(i--){
    aStr[i] = aStr[i].replace(/"/g,"");
}
// ["single", "words", "fixed string of words"]
12
Sean Kinsey

完全な解決策は次のとおりです。 https://github.com/elgs/splitargs

4
Qian Chen

ES6ソリューションのサポート:

  • 内側の引用符を除いてスペースで分割
  • 引用符を削除しますが、バックスラッシュでエスケープされた引用符は削除しません
  • エスケープされた引用符は引用符になります
  • どこにでも引用できます

コード:

str.match(/\\?.|^$/g).reduce((p, c) => {
        if(c === '"'){
            p.quote ^= 1;
        }else if(!p.quote && c === ' '){
            p.a.Push('');
        }else{
            p.a[p.a.length-1] += c.replace(/\\(.)/,"$1");
        }
        return  p;
    }, {a: ['']}).a

出力:

[ 'single', 'words', 'fixed string of words' ]
3
Tsuneo Yoshioka

これにより、配列に分割され、残りの文字列から周囲の引用符が削除されます。

const parseWords = (words = '') =>
    (words.match(/[^\s"]+|"([^"]*)"/gi) || []).map((Word) => 
        Word.replace(/^"(.+(?="$))"$/, '$1'))
0
tim.breeding

この魂は、二重引用符( ")と一重引用符( ')の両方で機能します。

コード

str.match(/[^\s"']+|"([^"]*)"/gmi)

// ["single", "words", "fixed string of words"]

ここでは、この正規表現がどのように機能するかを示しています。 https://regex101.com/r/qa3KxQ/2

0
julianYaman