Rainmeter正则匹配Discord成员数据失效问题求助
修复Rainmeter中匹配Discord语音用户的正则表达式
修复后的正则表达式
"username": "((?!Bot1|Bot2)[^"]*)"(?:(?!}\s*,\s*{).)*?"channel_id": "(\d+)"
原正则的问题分析
你原来的正则"username": "((?!Bot1|Bot2)[^"]*)"(?:(?!"id").)*channel_id": "(\d+)".*?核心问题出在中间的(?:(?!"id").)*部分:
- 这个负前瞻规则要求匹配的内容里不能包含
"id",但每个Discord成员对象里都必然有"id"字段,导致正则在匹配到第一个"id"后就无法继续向前,根本碰不到同一个对象里的channel_id。 - 两部分单独工作时,要么只匹配用户名(没有限制跨对象),要么只匹配channel_id,但组合后因为中间的错误限制,无法关联同一对象的两个字段。
修复逻辑说明
- 限定匹配范围在单个成员对象内:
(?:(?!}\s*,\s*{).)*?这个规则的作用是,只要没遇到成员对象结束的},就继续匹配,确保username和channel_id属于同一个成员对象,不会跨对象匹配。 - 保留Bot排除规则:
((?!Bot1|Bot2)[^"]*)继续生效,直接排除用户名是Bot1或Bot2的条目。 - 惰性匹配避免过度匹配:末尾的
.*?确保找到当前对象内的第一个channel_id就停止,避免意外匹配到后续对象的内容。
验证效果
针对你提供的JSON示例:
- 会成功捕获
User1和对应的频道ID; - Bot1因为没有
channel_id字段,不会被匹配; - Bot2虽然有
channel_id,但用户名被排除规则过滤,也不会被匹配。
内容的提问来源于stack exchange,提问作者Blancsoir
相关产品推荐
相关产品推荐

