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

时间:2014-08-10 20:41:38

标签: 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;

    }

如果有人能够通过这个并教会我如何重写这一点,我会非常感激,并且更加正确。有效的方式(也许是更多&#34; JS&#34;方式)。

谢谢!

修改 -

我刚刚发现了一些问题,其中一些是我修复的,有些我不确定如何处理而不会使代码过于复杂(例如字符串&#34; hello&# 39;每个人&#39;!&#34; 没有正确分裂......)

1 个答案:

答案 0 :(得分:3)

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

string.match(/(?:['"].+?['"])|\S+/g)

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

如果您还想在引号后匹配字符,例如?!,您可以尝试:

/(?:['"].+?['"]\W?)|\S+/g

对于"hello 'every body'!",它会给你这个数组:

["hello", "'every body'!"]

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

来显式标点符号
[,.?!]

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

string.match(regex).map(function(x){return x.trim()})