将字符串拆分为数组,同时忽略撇号之间的内容

tho*_*mas 6 javascript

我需要一些带字符串的东西,然后把它分成一个数组.我希望在每个空间之后拆分它,这样 -

"大家好!" 变成---> [" 你好 "," 每个人! "]

但是,我希望它忽略撇号之间的空格.所以举例 -

"你今天好吗?" 变成---> [" 如何 ","你是你"," 今天? "]

现在我写了下面的代码(有效),但有些东西告诉我,我所做的非常可怕,可以用大约50%的代码来完成.我也是JS的新手,所以我想我仍然不遵守语言的所有习语.

function getFixedArray(text) {

        var textArray = text.split(' '); //Create an array from the string, splitting by spaces.

        var finalArray = [];
        var bFoundLeadingApostrophe = false;
        var bFoundTrailingApostrophe = false;
        var leadingRegExp = /^'/;
        var trailingRegExp = /'$/;
        var concatenatedString = "";

        for (var i = 0; i < textArray.length; i++) {
            var text = textArray[i];

            //Found a leading apostrophe
             if(leadingRegExp.test(text) && !bFoundLeadingApostrophe && !trailingRegExp.test(text)) {
                concatenatedString =concatenatedString + text;
                bFoundLeadingApostrophe = true;
             }

             //Found the trailing apostrophe
             else if(trailingRegExp.test(text ) && !bFoundTrailingApostrophe) {

                concatenatedString = concatenatedString + ' ' + text;
                finalArray.push(concatenatedString);

                concatenatedString = "";

                bFoundLeadingApostrophe = false;
                bFoundTrailingApostrophe = false;
             }

             //Found no trailing apostrophe even though the leading flag indicates true, so we want this string.
             else if (bFoundLeadingApostrophe && !bFoundTrailingApostrophe) {
                concatenatedString = concatenatedString + ' ' + text;
             }

             //Regular text
             else {
                finalArray.push(text);
             }

        }

        return finalArray;

    }
Run Code Online (Sandbox Code Playgroud)

如果有人能够以更正确和有效的方式(也许更"JS"的方式)教我如何重写,我将深深感激.

谢谢!

编辑 -

好吧,我刚刚发现了一些问题,其中一些是我修复的,有些我不知道怎么处理而不使这个代码太复杂(例如字符串"hello'every body'!"不能正确分割.. ..)

elc*_*nrs 3

您可以尝试匹配而不是拆分:

string.match(/(?:['"].+?['"])|\S+/g)
Run Code Online (Sandbox Code Playgroud)

上面的正则表达式将匹配引号之间的任何内容(包括引号),或者任何不是空格的内容。

如果您还想匹配引号后的字符,?!尝试:

/(?:['"].+?['"]\W?)|\S+/g
Run Code Online (Sandbox Code Playgroud)

因为"hello 'every body'!"它会给你这个数组:

["hello", "'every body'!"]
Run Code Online (Sandbox Code Playgroud)

请注意,\W也匹配空格,如果您想匹配标点符号,您可以通过使用字符类代替\W

[,.?!]
Run Code Online (Sandbox Code Playgroud)

或者简单地在匹配后修剪字符串:

string.match(regex).map(function(x){return x.trim()})
Run Code Online (Sandbox Code Playgroud)