我试图像这样导入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
}
}
答案 0 :(得分:0)
String.indexOf()
method期望string
是它的第一个参数。
/<pattern>/
语法是一个正则表达式文字,它导致RegExp
对象的实例化。因此,如错误消息所示,它不是string
。
要解决此问题,请在调用String.indexOf()
时使用字符串而不是正则表达式:
row.indexOf('cap')
但是此搜索不区分大小写。如果您不希望区分大小写,那么使用正则表达式是明智的。
要使用正则表达式,您需要的是String.search()
method。它期望RegExp
作为其第一个参数,并具有等效的返回值(即,第一次匹配开始的字符串中的索引)。
另外一些观察结果:
编写循环的方式,即使未找到匹配项,也将返回第一次迭代的结果。
您指定的正则表达式(/cap*/i
)正在寻找字符ca
,后跟0个或多个p
字符。因此它将匹配ca
,cap
,capppp
等。
也许您想要这样的东西:
getManufacturerDescriptionColumn() {
for (const row in this.data) {
let matchIndex = row.search(/cap/i);
if (matchIndex > -1) {
return matchIndex;
}
}
}