我正在将 Discord 服务器响应与正则表达式进行匹配,并且它在不久前可以工作,但现在它坏了。 它应该从 JSON 中检查所有连接的用户是否有语音通道连接(只有那些具有通道 ID 的用户),但排除这两个机器人。 然后它会返回用户和频道 ID。 需要“id”的负前瞻,以便在检查频道 id 时不会在用户之间跳转。 未连接到任何频道的用户将看起来像 Bot1。
到目前为止我的表达是:
"username": "((?!Bot1|Bot2)[^"]*)"(?:(?!"id").)*channel_id": "(\d+)".*?
它有效,但现在找不到匹配项了。
这两个部分单独工作但不组合:
"username": "((?!Bot1|Bot2)[^"]*)"
(?:(?!"id").)*channel_id": "(\d+)".*?
JSON 是:
...
"members": [
{
"id": "0",
"username": "User1",
"discriminator": "0000",
"avatar": null,
"status": "online",
"avatar_url": "https://cdn.discordapp.com/widget-avatars/...",
"deaf": false,
"mute": false,
"self_deaf": false,
"self_mute": false,
"suppress": false,
"channel_id": "(digits between 0-9)"
},
{
"id": "1",
"username": "Bot1",
"discriminator": "0000",
"avatar": null,
"status": "online",
"avatar_url": "https://cdn.discordapp.com/widget-avatars/..."
},
{
"id": "2",
"username": "Bot2",
"discriminator": "0000",
"avatar": null,
"status": "online",
"avatar_url": "https://cdn.discordapp.com/widget-avatars/...",
"game": {
"name": "music | /help"
},
"deaf": false,
"mute": false,
"self_deaf": false,
"self_mute": false,
"suppress": false,
"channel_id": "(digits between 0-9)"
}
],
"presence_count": 3
}
我正在使用 Rainmeter,它能够本地使用正则表达式,但无法解析 JSON。
最直接的问题是,您的组合正则表达式假定这两个值立即相邻,但它们不在您发布的示例 JSON 中。
我无法访问您正在使用的平台,但请尝试在值之间添加可选的附加字段。
"username": "((?!Bot[12])[^"]*)"
(?:\s*"[^"]+": "[^"]*",)*
\s*"channel_id": "(\d+)"
(为了便于阅读,我添加了换行符,但您可能想删除它们。)
可选组
(?:...)*
会跳过您感兴趣的两个之间的零个或多个附加 "key": "value"
对。因为正则表达式现在无法跨越不相关的 JSON 字典之间的边界,并且我们准确地定位键 channel_id
(并且我们依赖于JSON 有效,因此不能有任何重复的键),不需要负向前瞻。