“ RegExp”类型的参数不能分配给“ string”类型的参数

时间:2020-01-17 03:40:42

标签: javascript angular typescript

我试图像这样导入Excel文件:

onFileChange(event: any) 
  {
    const inputFile: DataTransfer = <DataTransfer>(event.target); 
    const fileReader: FileReader = new FileReader();
    fileReader.onload = (event: any) => 
    {
      const binaryString: string = event.target.result;
      const workBook: XLSX.WorkBook = XLSX.read(binaryString, { type: 'binary', sheetStubs: true}); 
      /* sheetstubs true supposedly shows empty cells but isn't */
      console.log(typeof binaryString)

      const workSheetName: string = workBook.SheetNames[0];
      console.log(workSheetName)
      const workSheet: XLSX.WorkSheet = workBook.Sheets[workSheetName];

      this.data = <Array>(XLSX.utils.sheet_to_json(workSheet, 
      {header: 1, blankrows: true }));


    };
    fileReader.readAsBinaryString(inputFile.files[0]);

  }

,并希望使用正则表达式查找其中包含短语“ cap”的任何单元格的索引(基本上是列号)。

我正尝试使用如下所示的正则表达式在任何单元格中搜索术语cap,但遇到以下错误

Argument of type 'RegExp' is not assignable to parameter of type 'string'.我不清楚该错误试图向我指出什么,以及实现我所要实现的目标的一种好方法。

getManufacturerDescriptionColumn()
  {
    for (const row in this.data)
    {
      var descIndex = row.indexOf(/cap*/i)
      return descIndex
    }
  }

1 个答案:

答案 0 :(得分:0)

String.indexOf() method期望string是它的第一个参数。

/<pattern>/语法是一个正则表达式文字,它导致RegExp对象的实例化。因此,如错误消息所示,它不是string

要解决此问题,请在调用String.indexOf()时使用字符串而不是正则表达式:

row.indexOf('cap')

但是此搜索不区分大小写。如果您不希望区分大小写,那么使用正则表达式是明智的。

要使用正则表达式,您需要的是String.search() method。它期望RegExp作为其第一个参数,并具有等效的返回值(即,第一次匹配开始的字符串中的索引)。


另外一些观察结果:

  • 编写循环的方式,即使未找到匹配项,也将返回第一次迭代的结果。

  • 您指定的正则表达式(/cap*/i)正在寻找字符ca,后跟0个或多个p字符。因此它将匹配cacapcapppp等。

也许您想要这样的东西:

getManufacturerDescriptionColumn() {
  for (const row in this.data) {
    let matchIndex = row.search(/cap/i);
    if (matchIndex > -1) {
      return matchIndex;
    }
  }
}