因此,这里的代码是以更简化的方式编写的:
var reader = new FileReader();
reader.onload = function(progressEvent) {
// By lines
var lines = this.result.split('\n');
let N = /^(N1\d{14}.{78}|N2.{70}|N3.{82}|N9\d{14}.{14}\d{6})$/;
for (var line = 0; line < lines.length; line++) {
if (N.test(lines[line])) {
console.log(lines[line]);
} else {
console.log("Invalid register = ", lines[line]);
}
}
}我想要的是一种可以显示消息的方式,它可以告诉我该文件符合所有这些要求,如果不是,可以打印一条消息来告诉我该文件无效,但请继续在控制台向我显示该消息。我怎么能这么做?我的另一个问题是,是否有一种方法可以指定只有一个名为N1的寄存器
这里是一个文件示例
N108258594000135255240708 315370 BLABLA BLABLABL BLAB BLA
N2BLA2222016BLABLA BLABLABLA 3525.250
N3BLABLABLABL.EXE 01BF011351A2B06D7A88048CBDDC53CE
N908234944000135255240708 000016发布于 2020-02-17 21:38:12
如果没有出现2次N1,则可以在模式开始时使用负前瞻(?!.*N1.*N1),而不是断言2次N1
^(?!.*N1.*N1)(?:N1\d{14}.{78}|N2.{70}|N3.{82}|N9\d{14}.{14}\d{6})$若要保留消息并在循环后显示消息(如果所有消息都已通过),您可以引入一个变量并给它一个默认值true。
如果有不匹配的行,则将变量更改为false。
例如
// By lines
var lines = this.result.split('\n');
let N = /^(?!.*N1.*N1)(?:N1\d{14}.{78}|N2.{70}|N3.{82}|N9\d{14}.{14}\d{6})$/;
var passAll = true;
for (var line = 0; line < lines.length; line++) {
if (lines[line].trim() === "") continue;
if (N.test(lines[line])) {
console.log(lines[line]);
} else {
passAll = false;
console.log("Invalid register = ", lines[line]);
}
}
console.log(passAll === true ? "All lines passed" : "Not all lines passed");发布于 2020-02-18 12:46:11
我的理解是,您正在逐一处理每一行,如果有多个“寄存器名为N1",即通过regex测试并以N1开头的行,这将是一个错误。所以你必须跟踪你是否见过这样的一条线:
var reader = new FileReader();
var invalidRegister = false;
var seenN1 = false;
reader.onload = function(progressEvent) {
// By lines
var lines = this.result.split('\n');
let N = /^(N1\d{14}.{78}|N2.{70}|N3.{82}|N9\d{14}.{14}\d{6})$/;
for (var line = 0; line < lines.length; line++) {
let s = lines[line];
if (N.test(s)) {
if (s.substr(0, 2) == 'N1') {
if (seenN1) {
console.log("Repeat N1 register = ", s);
invalidRegister = true;
continue;
}
seenN1 = true;
}
console.log(s);
} else {
console.log("Invalid register = ", s);
invalidRegister = true;
}
}
if (invalidRegister) {
console.log('The file is not valid.');
}
};https://stackoverflow.com/questions/60267502
复制相似问题