JS正则匹配英雄信息时跳过第二条数据,求排查错误原因
正则匹配跳过英雄的问题分析与修复
原始场景
待匹配的英雄文本
Team A Draft: Hero 1: Name: Pugna Lane: Mid
Hero 2: Name: Faceless Void Lane: Safelane
Hero 3: Name: Earthshaker Lane: Offlane
Hero 4: Name: Lion Lane: Support
Hero 5: Name: Lina Lane: Support
使用的正则表达式
/Hero\s+(\d+):\s+Name:\s+(\w+)\s+Lane:\s+(\w+)/g
异常的匹配结果
[ { "position": 1, "hero": "Pugna", "lane": "Mid" }, { "position": 2, "hero": "Earthshaker", "lane": "Offlane" }, { "position": 3, "hero": "Rubick", "lane": "Support" }, { "position": 4, "hero": "Juggernaut", "lane": "Safe" } ]
问题根源
- 正则无法匹配带空格的英雄名:第二个英雄
Faceless Void包含空格,但你用的\w+只能匹配字母、数字和下划线,空格不在匹配范围内,导致这条记录直接被跳过。 - 匹配结果出现无关数据:
Rubick、Juggernaut这些英雄根本不在原始文本里,说明你的getHeroMap函数要么复用了旧的匹配缓存,要么存在硬编码/赋值逻辑错误。
修复步骤
1. 修正正则表达式
把匹配英雄名的\w+替换成能匹配空格且不会过度匹配的模式,推荐用非贪婪匹配到Lane:之前的内容:
/Hero\s+(\d+):\s+Name:\s+([^L]+?)\s+Lane:\s+(\w+)/g
[^L]+?:非贪婪匹配所有不是L的字符,刚好停在Lane:的开头,完美适配带空格的英雄名。- 非贪婪模式(
?)能避免匹配到下一行的内容。
2. 排查getHeroMap函数
- 全局正则会保留
lastIndex记录上次匹配的位置,每次匹配前要手动重置regex.lastIndex = 0,避免后续匹配位置偏移。 - 检查函数里是否有硬编码的错误英雄数据,或者匹配结果的索引、赋值逻辑是否出错,确保只使用当前匹配到的结果。
内容的提问来源于stack exchange,提问作者Marc Rasmussen
相关产品推荐
相关产品推荐

