用于排除两个捕获组之间的字符串的正则表达式
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+)"
在第 1 组和第 2 组中捕获了用户名和频道 ID。
包括其他一些小的调整。
我正在尝试使用正则表达式从 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+)"
在第 1 组和第 2 组中捕获了用户名和频道 ID。
包括其他一些小的调整。