在匹配正则表达式中获取多行

时间:2017-01-23 21:31:27

标签: javascript arrays regex filereader

我正在尝试将文件内容拆分为一定大小的块(比如40000个字符,包括空格和什么不是)

但是,当线路发生变化时,我将数组拆分,这是不必要的行为。

        var files = $('#upload').get(0).files;
        if (files.length > 0) {
            var reader = new FileReader()
            reader.onloadend = function () {
                var content = reader.result
                var buffer = 40000
                var contentList = content.match(new RegExp('.{1,' + buffer + '}', 'gm'))
                console.info('list : ', contentList)
            }
            reader.readAsBinaryString(files[0])
        }

一个额外的问题,我可以看到没有迹象表明文件中有新行被读取,尽管文件中明显有多行。我偶尔会遗漏像\n这样的东西。

1 个答案:

答案 0 :(得分:1)

更新:我刚刚看了一下XRegExp库支持捕获换行符的功能,它非常简单:它只是替换了所有.个字符(除了匹配所有字符外)字符类[\s\S],匹配所有字符句点的新行)。这是有效的,因为\s匹配一组特定的空白字符,\S(大写s)与\s完全相反。取两者的结合,没有不匹配的角色。所以,@apsillers的建议完全正确:用[\s\S]替换你的点以匹配任何角色。

您正在寻找的是“单线模式”,不幸的是,JavaScript不支持它:

有两种选择:

  1. 正如该博客所述,您可以使用XRegExp库。

  2. 您可以尝试使用您确定不会在数据中显示的Unicode代码点替换换行符,然后在执行RegExp匹配后将其替换回来:

    var input = ...;
    
    var inputSingleLine = input.replace(/\n/g, "\u27BF");
    
    var contentList = inputSingleLine.match(new RegExp('.{1,' + buffer + '}', 'gm'));
    
    for (var index = 0; index < contentList.length; index++)
        contentList[index] = contentList[index].replace(/\u27BF/g, "\n");
    
    console.info('list : ', contentList);
    

    (假设您可以在开始匹配之前将整个文件(包括所有换行符)放入单个变量中)