我不是一位经验丰富的 JavaScript 程序员。 这是我第一个使用 JS 的项目。
我正在 Linux 上进行开发,即将发布我的第一个版本。 在 Windows 机器上运行该项目时,我遇到了以下问题...
global.DBSysInfo;
console.log("DBSysInfo =\n" + DBSysInfo);
var pnt1 = DBSysInfo.indexOf('DBActive = "yes"');
console.log("pnt1 = " + pnt1);
var pnt2 = DBSysInfo.indexOf(os.EOL + os.EOL, pnt1) + 1;
console.log("pnt1 = " + pnt1 + "; pnt2 = " + pnt2);
console.log("DBSysInfo.substring =\n" + DBSysInfo.substring(pnt1, pnt2));
上面的代码在 Linux 上按预期工作:
DBSysInfo =
SysLocation = "C:\Users\mlake\MELGenKey"
DBActive = "yes"
DBName = "SOT2-KILLE20240704"
DBUserID = "2.0"
DBStatus = "1"
DBSecurity = "0"
DBLocation = "DBs/SOT2-KILLE20240704"
pnt1 = 42
pnt1 = 42; pnt2 = 176
DBSysInfo.substring =
DBActive = "yes"
DBName = "SOT2-KILLE20240704"
DBUserID = "2.0"
DBStatus = "1"
DBSecurity = "0"
DBLocation = "DBs/SOT2-KILLE20240704"
在 Windows 上,输出为:
DBSysInfo =
SysLocation = "C:\Users\mlake\MELGenKey"
DBActive = "yes"
DBName = "SOT2-KILLE20240704"
DBUserID = "2.0"
DBStatus = "1"
DBSecurity = "0"
DBLocation = "DBs/SOT2-KILLE20240704"
pnt1 = 42
pnt1 = 42; pnt2 = 0
DBSysInfo.substring =
SysLocation = "C:\Users\mlake\MELGenKey"
我不明白为什么 Windows 上的输出会有所不同。 为什么pnt2会是0? 我唯一能想到的是第二个“indexOf”语句将“DBSysInfo”视为数组。 如果是这样,为什么? Windows 上的全局处理方式与 Linux 上的处理方式不同吗?
我尝试在 Windows 上使用 Edge 和 Firefox,得到相同的结果,但代码位于 Node 中,我认为所使用的浏览器在这种情况下不会产生任何差异。
string.indexOf() 在 Linux 和 Windows 上的处理方式相同吗?
是的。
我唯一能想到的是第二个“indexOf”语句将“DBSysInfo”视为数组。
这是可能的(不是“处理”,但
DBSysInfo
实际上是一个数组),但更有可能的是字符串的内容不是你所期望的,并且 indexOf
返回 -1,因为搜索字符串中实际上不存在模式。无论如何,您都可以使用调试器或打印调试来确认:
console.log("%O", DBSysInfo);
%O
格式说明符对应于检查类型输出,它将引用字符串、括号数组并将非打印字符显示为转义符。
即使在 Windows 上,也很常见 Unix 行结尾,因此严格查找
os.EOL
很容易出错。允许灵活行结尾的正则表达式是插入的一个不错的替代方案:
let pnt2 = DBSysInfo.indexOf(/(\r?\n){2}/m, pnt1);
或者,如果您不写回该字符串,请考虑在它以
.replace(/\r\n/g, "\n")
到达时对其进行标准化。然后您可以直接搜索 "\n\n"
而不必担心换行符有多少个字符。