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

VB.NET正则拆分DataGridView第5列至4列及空引用异常排查

解决你的System.NullReferenceException问题及代码优化

咱们先一步步拆解你代码里的问题,再给出修正方案:

核心错误原因

  1. 未实例化ListBox:你把RegMatches初始化为Nothing,然后直接调用RegMatches.Items.Add(j),这必然触发空引用异常——你没法对一个不存在的ListBox实例操作它的Items集合。而且其实你根本不需要用ListBox来存匹配结果,直接用正则的匹配集合或者字符串列表就够了。
  2. 错误遍历字符串字符:For Each j As String In columnValues(i)这段代码会把字符串拆成单个字符遍历,而不是你想要的匹配整个字符串里的目标内容,这完全偏离了你的需求。
  3. 不合理的数组使用:每次循环ReDim Preserve columnValues(i)不仅效率低,而且完全没必要——你可以直接在循环里获取当前行第5列的单元格值,不需要额外存数组。
  4. 错误赋值单元格:你试图把ListBox控件直接赋值给DataGridView的单元格,这不符合控件值的赋值逻辑,应该把匹配到的文本内容赋值给单元格。

修正后的代码

下面是调整后的VB代码,解决了上述问题,同时实现你拆分第5列内容到后续4列的需求(你可以根据实际正则规则调整匹配逻辑):

' 定义正则(简化写法:[a|A]可改为[aA],字符集里竖线是普通字符,不是或逻辑)
Dim myRegex As New Regex("[aA]Bla")

' 遍历DataGridView的每一行
For i As Integer = 0 To ErrorsDgV.Rows.Count - 1
    ' 跳过自动生成的新行(如果你的DataGridView允许添加新行)
    If ErrorsDgV.Rows(i).IsNewRow Then Continue For
    
    ' 安全获取第5列的文本内容,避免空值报错
    Dim cellText As String = If(ErrorsDgV.Item(5, i).Value IsNot Nothing, 
                                ErrorsDgV.Item(5, i).Value.ToString(), "")
    
    ' 获取当前单元格中所有符合正则的匹配结果
    Dim matches As MatchCollection = myRegex.Matches(cellText)
    
    ' 将匹配结果拆分到后续4列(索引6到9对应原需求的第6-9列)
    For colOffset As Integer = 0 To 3
        Dim targetColIndex As Integer = 6 + colOffset
        ' 有对应匹配项就赋值,没有则留空
        ErrorsDgV.Item(targetColIndex, i).Value = If(colOffset < matches.Count, 
                                                     matches(colOffset).Value, "")
    Next
Next

额外优化说明

  • 空值防护:增加了对单元格值为Nothing的判断,避免转换字符串时抛出异常。
  • 跳过新行:如果你的DataGridView开启了允许添加新行的功能,IsNewRow判断能避免处理空的待编辑行。
  • 高效匹配:直接用MatchCollection获取所有匹配结果,不需要额外的中间存储容器,逻辑更简洁高效。

内容的提问来源于stack exchange,提问作者user11613271

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 06:49:10