为何While循环中Regex仅匹配首个连续零组长度而非动态匹配?
问题原因分析
你的两种实现都犯了同一个核心错误:没有正确处理匹配后的字符串截断或匹配结果更新,导致每次都在重复匹配同一个开头的连续零组。
第一种代码的具体问题
- 仅执行了一次
regex.Match(newInput),循环内的matches始终是第一次的匹配结果,不会自动更新为下一个匹配项。 newInput = newInput.Remove(0, matches.Index)的逻辑完全错误:第一次匹配的零组本来就在索引0位置,移除后newInput还是从这个零组开始,下次循环依然匹配到同一个内容,直到抛出异常才会终止循环。
第二种代码的具体问题
虽然每次循环重新实例化了正则,但字符串截断逻辑依然错误:
- 你只移除了开头到匹配索引的部分,却没把匹配到的零组本身去掉。比如第一次匹配到索引0的"00",截断后
newInput还是"00111...",下次匹配还是开头的"00",自然每次添加的都是同一个值。 hasMatch的赋值时机不合理:应该先判断matches.Success,只有匹配成功时才执行添加和截断操作,否则直接设hasMatch = false退出循环,避免向列表中添加空值。
正确的实现方式
不需要手动截断字符串,直接用正则的Matches方法就能一次性获取所有匹配项,代码更简洁高效:
List<string> ZerosMatch(string input) { var regex = new Regex(@"0+"); // 等价于[0]{1,},写法更简洁 return regex.Matches(input) .Cast<Match>() .Select(m => m.Value) .ToList(); }
如果一定要用循环+单个Match的方式,可以通过NextMatch()获取下一个匹配项:
List<string> ZerosMatch(string input) { var list = new List<string>(); var regex = new Regex(@"0+"); var match = regex.Match(input); while (match.Success) { list.Add(match.Value); match = match.NextMatch(); // 直接获取下一个匹配结果 } return list; }
内容的提问来源于stack exchange,提问作者Blaze
相关产品推荐
相关产品推荐

