nodejs 正则匹配结果有问题?

请问这个正则有问题吗,获取formhash的值,但是结果却有很多null是怎么回事?

var http = require("http");

var url = {
    host:"bbs.colg.cn", 
    path:"/thread-7076705-1-1.html", 
    method:"GET"};

http.get(url,function(get){
    get.setEncoding("utf8");
    get.on("data",(data)=>{
        var data = data.match(/formhash" value="(.*?)"/g);
        console.log(data);
    });
});

null
null
null
null
null
[ 'formhash" value="3807b922"', 'formhash" value="3807b922"' ]
null
null

阅读 2.1k
1 个回答

这个问题不是正则的问题。

http 中的data事件是在有数据片段到来时触发,而不是全部数据返回时才触发。可使用下面的代码片段实验:

var http = require("http");
var fs = require('fs');

var url = {
    host:"bbs.colg.cn",
    path:"/thread-7076705-1-1.html",
    method:"GET"};

http.get(url,function(get){
    get.setEncoding("utf8");
    var result = '';
    var i = 0;
    get.on("data",(data)=>{
        result += data;
        fs.writeFileSync('./tmp/' + i +  '.html', data, 'utf-8');
        i++;
        var data = data.match(/formhash" value="(.*?)"/g);
    });
});

我测试的结果是:共生产了37个文件;

在没有formhash的data中,返回的就是 null。

这个问题的解决方案是在数据全部获取到时,再使用正则,这就用到end事件。

例如:

var http = require("http");
var fs = require('fs');

var url = {
    host:"bbs.colg.cn",
    path:"/thread-7076705-1-1.html",
    method:"GET"};

http.get(url,function(get){
    get.setEncoding("utf8");
    var result = '';
    get.on("data",(data)=>{
        result += data;
    });
    get.on("end", (data) => {
        var res = result.match(/formhash" value="(.*?)"/g);
        console.log(res);
    })
});
推荐问题