String.includes 找不到子字符串
Posted
技术标签:
【中文标题】String.includes 找不到子字符串【英文标题】:String.includes doesn't find substring 【发布时间】:2022-01-14 11:11:58 【问题描述】:我有以下文字:
LOG: time="2021-12-09T16:55:25+01:00" level=debug msg="???? GetLatestBlock called" blockHeight=3 blockID=ee98016d268630db54b814d18d0127edac8cc36f90d193c0c6f5fd4909bbd8b1
,LOG: time="2021-12-09T16:55:25+01:00" level=debug msg="???? GetAccountAtLatestBlock called" address=f8d6e0586b0a20c7
,LOG: time="2021-12-09T16:55:26+01:00" level=debug msg="️✉️ Transaction submitted" txID=5a46897e60f13ee68e11ef754983fefe9ec7bc8a2ca6079f0665e404138735e9
,LOG: time="2021-12-09T16:55:26+01:00" level=info msg="⭐ Transaction executed" computationUsed=6 txID=5a46897e60f13ee68e11ef754983fefe9ec7bc8a2ca6079f0665e404138735e9
,LOG: time="2021-12-09T16:55:26+01:00" level=debug msg="\x1b[1;34mLOG\x1b[0m \x1b[2m[5a4689]\x1b[0m \"Hello from Emulator\""
time="2021-12-09T16:55:26+01:00" level=debug msg="\x1b[1;34mLOG\x1b[0m \x1b[2m[5a4689]\x1b[0m 0x1cf0e2f2f715450"
time="2021-12-09T16:55:26+01:00" level=debug msg="\x1b[1;34mLOG\x1b[0m \x1b[2m[5a4689]\x1b[0m 0x179b6b1cb6755e31"
time="2021-12-09T16:55:26+01:00" level=debug msg="???? Block #4 committed" blockHeight=4 blockID=5fd780a98baad6d30f66cf75e76c3e1c9398097a9bb2e3f239f0cd7e166f6932
,LOG: time="2021-12-09T16:55:26+01:00" level=debug msg="???? GetTransactionResult called" txID=5a46897e60f13ee68e11ef754983fefe9ec7bc8a2ca6079f0665e404138735e9
存储在一个名为transactionLogs
的变量中(所以你看到的输出是console.log(transactionLogs)
),它是一个字符串。
我想检查事务日志是否包含两个地址。一封来自 Alice 0x01cf0e2f2f715450
和一封来自 Bob 0x179b6b1cb6755e31
。
我的问题是,当我像这样调用includes
时(其中Alice
和Bob
是字符串):
Alice; // 0x01cf0e2f2f715450
Bob; // 0x179b6b1cb6755e31
transactionLogs.includes(Alice); // false
transactionLogs.includes(Bob); // true
对 Alice 的搜索返回 false
。
我认为它与转义反斜杠有关,所以我尝试运行 transactionLogs.replace(String.fromCharCode(92), '')
但这并没有改变结果。
这里发生了什么?为什么includes
没有为 Alice 返回true
?
【问题讨论】:
您为 Alice 提到的 Id,即 0x01cf0e2f2f715450 不在日志中,是吗? 我在你的文本中找不到 0x01cf0e2f2f715450,我只看到一个 0x1cf0e2f2f715450(注意缺少 0) Deepack 是正确的:日志中包含0x1cf...
,因此搜索0x01cf...
将不起作用。
Alice
似乎是 0x1cf0e2f2f715450
,而您正在寻找 0x01cf0e2f2f715450
。记录 0x01cf0e2f2f715450
或返回 0x1cf0e2f2f715450
可能有什么问题?
也许你可以transactionLogs.includes(parseInt(Alice, 16).toString(16))
【参考方案1】:
为什么包括不为爱丽丝返回
true
?
因为日志字符串中不存在该字符串:
const transactionLogs = `
LOG: time="2021-12-09T16:55:25+01:00" level=debug msg="? GetLatestBlock called" blockHeight=3 blockID=ee98016d268630db54b814d18d0127edac8cc36f90d193c0c6f5fd4909bbd8b1
,LOG: time="2021-12-09T16:55:25+01:00" level=debug msg="? GetAccountAtLatestBlock called" address=f8d6e0586b0a20c7
,LOG: time="2021-12-09T16:55:26+01:00" level=debug msg="️✉️ Transaction submitted" txID=5a46897e60f13ee68e11ef754983fefe9ec7bc8a2ca6079f0665e404138735e9
,LOG: time="2021-12-09T16:55:26+01:00" level=info msg="⭐ Transaction executed" computationUsed=6 txID=5a46897e60f13ee68e11ef754983fefe9ec7bc8a2ca6079f0665e404138735e9
,LOG: time="2021-12-09T16:55:26+01:00" level=debug msg="\x1b[1;34mLOG\x1b[0m \x1b[2m[5a4689]\x1b[0m \"Hello from Emulator\""
time="2021-12-09T16:55:26+01:00" level=debug msg="\x1b[1;34mLOG\x1b[0m \x1b[2m[5a4689]\x1b[0m 0x1cf0e2f2f715450"
time="2021-12-09T16:55:26+01:00" level=debug msg="\x1b[1;34mLOG\x1b[0m \x1b[2m[5a4689]\x1b[0m 0x179b6b1cb6755e31"
time="2021-12-09T16:55:26+01:00" level=debug msg="? Block #4 committed" blockHeight=4 blockID=5fd780a98baad6d30f66cf75e76c3e1c9398097a9bb2e3f239f0cd7e166f6932
,LOG: time="2021-12-09T16:55:26+01:00" level=debug msg="? GetTransactionResult called" txID=5a46897e60f13ee68e11ef754983fefe9ec7bc8a2ca6079f0665e404138735e9
`;
const Alice = `0x01cf0e2f2f715450`;
const Bob = `0x179b6b1cb6755e31`;
console.log(
Alice: transactionLogs.includes(Alice),
Bob: transactionLogs.includes(Bob),
);
【讨论】:
【参考方案2】:您似乎正在搜索交易日志中错误打印的十六进制地址。
我认为您应该更改事务日志逻辑以避免在记录时切断地址中的前导0。
否则,您必须从正在搜索的地址中删除前导零,即使用
transactionLog.includes('0x' + parseInt(Alice, 16).toString(16))
【讨论】:
以上是关于String.includes 找不到子字符串的主要内容,如果未能解决你的问题,请参考以下文章