var str = 'single words "fixed string of words"';
var astr = str.split(" "); // need fix
配列を次のようにしたいと思います。
var astr = ["single", "words", "fixed string of words"];
str.match(/\w+|"[^"]+"/g)
//single, words, "fixed string of words"
受け入れられた答えは完全に正しいわけではありません。のような非スペース文字で区切ります。および-そして結果に引用符を残します。引用符を除外するようにこれを行うためのより良い方法は、次のようにグループをキャプチャすることです。
//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
これは、分割と正規表現のマッチングを組み合わせて使用します。
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"]
完全な解決策は次のとおりです。 https://github.com/elgs/splitargs
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' ]
これにより、配列に分割され、残りの文字列から周囲の引用符が削除されます。
const parseWords = (words = '') =>
(words.match(/[^\s"]+|"([^"]*)"/gi) || []).map((Word) =>
Word.replace(/^"(.+(?="$))"$/, '$1'))
この魂は、二重引用符( ")と一重引用符( ')の両方で機能します。
コード:
str.match(/[^\s"']+|"([^"]*)"/gmi)
// ["single", "words", "fixed string of words"]
ここでは、この正規表現がどのように機能するかを示しています。 https://regex101.com/r/qa3KxQ/2