Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/448.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 拆分字符串,但在拆分数组中保留分隔符_Javascript_String_Split - Fatal编程技术网

Javascript 拆分字符串,但在拆分数组中保留分隔符

Javascript 拆分字符串,但在拆分数组中保留分隔符,javascript,string,split,Javascript,String,Split,在JavaScript中给定如下字符串 var a = 'hello world\n\nbye world\n\nfoo\nbar\n\nfoo\nbaz\n\n'; 我想把它分成这样一个数组 ['hello world', '\n\n', 'bye world', '\n\n', 'foo\nbar', '\n\n', 'foo\nbaz', '\n\n']. 如果输入是var a='hello world\n\n ye world',则结果应该是['hello world','\n\n'

在JavaScript中给定如下字符串

var a = 'hello world\n\nbye world\n\nfoo\nbar\n\nfoo\nbaz\n\n';
我想把它分成这样一个数组

['hello world', '\n\n', 'bye world', '\n\n', 'foo\nbar', '\n\n', 'foo\nbaz', '\n\n'].
如果输入是
var a='hello world\n\n ye world'
,则结果应该是
['hello world','\n\n','bye world']

换句话说,我希望将“\n\n”周围的字符串拆分为一个数组,以便该数组也包含“\n\n”。在JavaScript中有什么简洁的方法可以做到这一点吗?

这里有一行:

str.match(/\n\n|(?:[^\n]|\n(?!\n))+/g)
下面是它的工作原理:

  • \n\n
    匹配两个连续的换行符
  • (?:[^\n]|\n(?!\n))+
    匹配任意一个或多个字符的任意序列
    • [^\n]
      不是换行符,或
    • \n(?!\n)
      换行符,但仅当不后跟另一个换行符时
此递归模式可应用于任何长度:

// useful function to quote strings for literal match in regular expressions
RegExp.quote = RegExp.quote || function(str) {
    return (str+"").replace(/(?=[.?*+^$[\]\\(){}|-])/g, "\\");
};
// helper function to build the above pattern recursively
function buildRecursivePattern(chars, i) {
    var c = RegExp.quote(chars[i]);
    if (i < chars.length-1) return "(?:[^" + c + "]|" + c + buildRecursivePattern(chars, i+1) + ")";
    else return "(?!" + c + ")";
}
function buildPattern(str) {
    return RegExp(RegExp.quote(delimiter) + "|" + buildRecursivePattern(delimiter.match(/[^]/g), 0) + "+", "g");
}

var str = 'hello world\n\nbye world\n\nfoo\nbar\n\nfoo\nbaz\n\n',
    delimiter = "\n\n",
    parts;
parts = str.match(buildPattern(delimiter))

你想把
'a\n\n\n\nb'
分成什么?@AdamZalcman我试过在字符串上运行一个循环,并使用
indexOf
substr
函数来提取我想要的内容,但我想知道是否有更简洁的方法来解决这个问题。@Cameron这两个方法中的任何一个对我都合适:['a','\n\n',b']['a','\n\n','\n\n','b']对于我的特殊情况,这个输出是无关紧要的,所以我们可以选择哪一个导致更优雅的代码。对于分隔符保留在拆分元素中的类似问题,请参阅:+1000您的regexp mojo功能强大,老师。对于我们这些凡人来说,regexp的分解如何?是否应该
build()
调用
buildPattern
be
buildRecursivePattern
if ("a".split(/(a)/).length !== 3) {
    (function() {
        var _f = String.prototype.split;
        String.prototype.split = function(separator, limit) {
            if (separator instanceof RegExp) {
                var re = new RegExp(re.source, "g"+(re.ignoreCase?"i":"")+(re.multiline?"m":"")),
                    match, result = [], counter = 0, lastIndex = 0;
                while ((match = re.exec(this)) !== null) {
                    result.push(this.substr(lastIndex, match.index-lastIndex));
                    if (match.length > 1) result.push(match[1]);
                    lastIndex = match.index + match[0].length;
                    if (++counter === limit) break;
                }
                result.push(this.substr(lastIndex));
                return result;
            } else {
                return _f.apply(arguments);
            }
        }
    })();
}