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

Get multiple lines in match regex

我正在尝试将文件的内容拆分成一定大小的块(比如 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 之类的东西。

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


您要找的是 "single line mode",很遗憾,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);
    

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