Javascript 拆分空格和引号上的字符串,保持带引号的子字符串不变

Javascript 拆分空格和引号上的字符串,保持带引号的子字符串不变,javascript,regex,Javascript,Regex,我需要一种方法来拆分空格上的字符串,但保持引用的子字符串完好无损 例如: Input: str = 'this "is a"test string' Output: [this, is a, test, string] 当我使用: str.match(/\\?.|^$/g).reduce((p, c) => { if(c === '"' || c === "'"){ p.quote ^= 1; }else if(!p.quote && c

我需要一种方法来拆分空格上的字符串,但保持引用的子字符串完好无损

例如:

Input:
str = 'this "is a"test string'

Output:
[this, is a, test, string]
当我使用:

str.match(/\\?.|^$/g).reduce((p, c) => {
    if(c === '"' || 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
它保持引用的子字符串完整,并根据需要在空格上拆分

但是,在所提供的示例中,如果引用的子字符串后面紧跟着一个字母,则无法正确拆分术语。相反,我得到的结果是:

[this, is atest, string]
编辑:

我相信这个问题与其他类似的问题不同,因为它们都没有排除引号,并且在结束引号后没有空格时正确分割术语,比如:
“this”是一个“测试字符串”

有很多类似的“分割空格和引号”Q&As等等,它们中的大多数都使用正则表达式解决方案。事实上,您的代码至少可以在中找到(谢谢)

虽然这些解决方案中有一些不包括引号,但如果在结束引号后没有空格分隔符,并且它们都不排除引号并允许缺少空格,那么我只能找到一个有效的解决方案

这也不仅仅是一个简单的调整任何正则表达式的问题。如果您确实将正则表达式更改为使用捕获组,则不再可能使用简单的
match
方法。(通常的技巧是在循环中使用
exec
。)如果不使用捕获组,则需要在之后执行字符串操作以删除引号

最简单的解决方案是对
匹配的数组结果使用
map

使用
切片
字符串操作方法:

var str='this'是一个“测试字符串”;
var result=str.match(/“[^”]*”|\S+/g).map(m=>m.slice(0,1)=='''”?m.slice(1,-1):m);

控制台日志(结果)可能的@try catch finally副本该副本无效,原因与前一个相同-没有任何内容排除引号。(有趣的是,其中一个答案是OP试图使用的状态机代码。)