正则表达式函数的修正

问题描述 投票:0回答:1

我正在将 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。

regex discord
1个回答
0
投票

最直接的问题是,您的组合正则表达式假定这两个值立即相邻,但它们不在您发布的示例 JSON 中。

我无法访问您正在使用的平台,但请尝试在值之间添加可选的附加字段。

"username": "((?!Bot[12])[^"]*)"
(?:\s*"[^"]+": "[^"]*",)*
\s*"channel_id": "(\d+)"

(为了便于阅读,我添加了换行符,但您可能想删除它们。)

可选组

(?:...)*
会跳过您感兴趣的两个之间的零个或多个附加
"key": "value"
对。因为正则表达式现在无法跨越不相关的 JSON 字典之间的边界,并且我们准确地定位键
channel_id
(并且我们依赖于JSON 有效,因此不能有任何重复的键),不需要负向前瞻。

© www.soinside.com 2019 - 2024. All rights reserved.