You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何While循环中Regex仅匹配首个连续零组长度而非动态匹配?

问题原因分析

你的两种实现都犯了同一个核心错误:没有正确处理匹配后的字符串截断或匹配结果更新,导致每次都在重复匹配同一个开头的连续零组。

第一种代码的具体问题

  1. 仅执行了一次regex.Match(newInput),循环内的matches始终是第一次的匹配结果,不会自动更新为下一个匹配项。
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 09:16:12