Telegram用户名解析正则表达式匹配异常问题求助
Telegram用户名提取正则修复方案
问题原因
原正则中用于验证用户名的(?!.*_$)是全局断言,会检查整个输入字符串是否以下划线结尾,而非仅检查当前匹配的用户名。当输入字符串末尾存在下划线(如@aaaa, @jfewewf_)时,这个全局断言会直接导致整个正则匹配失败,即使前面的@aaaa是完全有效的用户名。
修复后的正则表达式
(?:(?<!\S)@|(?:(?:https?://|)(?:t\.me|telegram\.(?:me|dog))/(?:c/|)|tg://resolve\?domain=)|(?=^[a-z][a-z0-9_]{3,31}(?<!_)\.t\.me$))(?P<username>(?!.*_{2,})[a-z][a-z0-9_]{3,31}(?<!_))(?P<subdomain>\.t\.me)?
修改说明
- 移除全局结尾断言
(?!.*_$),改用(?<!_)作为用户名的后缀断言,仅校验当前匹配的用户名末尾是否为下划线。 - 合并重复的连续下划线校验:原
(?!.*__)(?!.*_{2,})简化为(?!.*_{2,}),因为__本身就是连续两个下划线的情况,无需重复校验。 - 简化subdomain格式的前置前瞻断言,去掉重复的用户名规则校验,复用后续的用户名验证逻辑。
验证效果
- 输入
@aaaa, @jfewewf:可正确匹配两个有效用户名。 - 输入
@aaaa, @jfewewf_:可正确匹配@aaaa,忽略末尾的无效用户名。 - 支持匹配
username.t.me、https://t.me/username、tg://resolve?domain=username等格式的用户名。
内容的提问来源于stack exchange,提问作者Okinea Dev
相关产品推荐
相关产品推荐

