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