用于排除两个捕获组之间的字符串的正则表达式

Regex expression to exclude a string between two capture groups

我正在尝试使用正则表达式从 api 字符串中捕获该用户的用户名和频道 ID。

不幸的是,我不能在 JSON 格式上使用 JSON 解析器,所以我(初学者)被 Regex 困住了。

我的解决方案发现用户名与其字符串匹配,找到频道 ID 并且也匹配该字符串。因为它是非贪婪的,它会找到最短的可能解决方案并创建多个捕获组,如果多个人连接。

但是问题来了,如果服务器的多个用户在线,但有些用户没有连接到一个频道。然后 Regex 找到第一个用户名并使用中间 space 直到它找到下一个用户的频道 ID。然后它显然给了我正确的频道 ID 但给了我不正确的用户。

我在某些时候排除了符号“{”,因为它可以分隔不同的用户并且有效。不幸的是,在某些情况下,“{”也可能出现在用户参数中,因此一些不再被捕获。

现在我尝试从两个捕获组之间的允许字符串中禁止字符串“id”。

但我无法让它工作。你有什么建议吗?

此示例正确捕获用户 1 和 3,但将用户名用户 2 与 Bot 1 的频道 ID 匹配。我不太了解口味,但它在测试站点上说 PCRE(PHP) 和到目前为止,这适用于我的程序。我缩短了头像链接并以....

开头

正则表达式:

username": "((?!Bot 1).*?)".*?channel_id": "([0-9]*?)"

字符串片段:

"members": [{"id": "0", "username": "User 1", "discriminator": "0000", "avatar": null, "status": "online", "deaf": false, "mute": false, "self_deaf": false, "self_mute": false, "suppress": false, "channel_id": "0123456789", "avatar_url": "https://..."}, {"id": "1", "username": "User 2", "discriminator": "0000", "avatar": null, "status": "online", "game": {"name": "pls help"}, "avatar_url": "https://..."}, {"id": "2", "username": "Bot 1", "discriminator": "0000", "avatar": null, "status": "online", "game": {"name": "music | ;;help"}, "deaf": false, "mute": false, "self_deaf": false, "self_mute": false, "suppress": false, "channel_id": "1234567890", "avatar_url": "https://..."}, {"id": "3", "username": "User 3", "discriminator": "0000", "avatar": null, "status": "online", "deaf": false, "mute": false, "self_deaf": false, "self_mute": false, "suppress": false, "channel_id": "2345678901", "avatar_url": "https://..."}], "presence_count": 4}

如其他建议,计划A应该是解析对象。对于计划 B,您的正则表达式可能如下所示:

"username": "([^"]+)"

如果您允许转义,例如,如果用户名是“User says 'hi' always”,它会变得有点棘手。在这种情况下,您可以使用此处描述的模式::

这里我们将 normal 情况设为 [^"\](不是 double-quote 或转义字符),而 special case being \" (escape double-quote).

要添加 channel_id,并假设每个对象都以 {"id": ... 开头,您可以执行以下操作:

希望对您有所帮助...不用说,这太过分了!我会稍微简化一下,或者如果可以的话,完全摆脱正则表达式。祝你好运!

用户名和频道之间不允许 {"id":

username": "((?!Bot 1)[^"]*)"(?:(?!\{"id").)*channel_id": "(\d+)"

live demo

在第 1 组和第 2 组中捕获了用户名和频道 ID。

包括其他一些小的调整。