如何修复TypeError:无法读取未定义的属性“ match”

时间:2019-07-25 12:43:17

标签: javascript node.js regex pattern-matching

我正在过滤nodejs中的文本文件,“ match”正则表达式给我过滤后的数组错误

var fs = require("fs");
var finalarray = [];
var data = [];
var data1 = [];

fs.readFile('dataforparsing', function (err, buf) {

  finalarray = buf.toString();// convert the object into the string

  data = finalarray.split("\n");// splitting based on new line

  for (i = 0; i < data.length; i++) {
    if (data[i].match(/sessionid:/g) && !data[i].match(/Input/g)) {// filtering of the rows
      data1[i] = data[i].toString();
      console.log(data1[i] + "\n");
    }
  }

var data3 = [];

for (i = 0; i < data1.length; i++) {
    data3[i] = data1[i].match(/[0-9]{13}/g);
    console.log(data3[i] + "\n");
  }

});

期望代码也应该在最后一个循环中工作,但是它在“ data1 [i] .match(..)”处给出错误,并根据REGEX表达式打印过滤后的输出。

3 个答案:

答案 0 :(得分:1)

问题是您仅填写找到匹配项的索引

if(data [i] .match ....){    data1 [i] = data [i] .toString(); <-我杀了你 }

因此,当您没有比赛时,您就会拥有

data[0] -- match
data[1] -- undefined
data[2] -- match

您要使用push()而不设置索引

data1.push(data[i]);

但是最后您只是重写filter()

var data1 = data.filter(item => item.match(/sessionid:/g) && !item.match(/Input/g))

答案 1 :(得分:0)

在此循环中,data中的任何项如果不符合if条件,将在该索引i上有一个 hole

for (i = 0; i < data.length; i++) {
  if (data[i].match(/sessionid:/g) && !data[i].match(/Input/g)) {
    data1[i] = data[i].toString();
    console.log(data1[i] + "\n");
  }
}

您可以分配到data1[i] = ...数组,而不是分配data1。现在,每个索引都会有一些价值

data1.push(data[i].toString())

答案 2 :(得分:0)

使用Arrays's push方法设置data1数组元素。

var fs = require("fs");
var finalarray = [];
var data = [];
var data1 = [];

fs.readFile('dataforparsing', function (err, buf) {

  finalarray = buf.toString();// convert the object into the string

  data = finalarray.split("\n");// splitting based on new line

  for (i = 0; i < data.length; i++) {
    if (data[i].match(/sessionid:/g) && !data[i].match(/Input/g)) {// filtering of the rows
      data1.push(data[i].toString());

    }
  }

var data3 = [];

for (i = 0; i < data1.length; i++) {
    data3[i] = data1[i].match(/[0-9]{13}/g);
    console.log(data3[i] + "\n");
  }

});

希望这会有所帮助。