VB.NET正则拆分DataGridView第5列至4列及空引用异常排查
解决你的System.NullReferenceException问题及代码优化
咱们先一步步拆解你代码里的问题,再给出修正方案:
核心错误原因
- 未实例化ListBox:你把
RegMatches初始化为Nothing,然后直接调用RegMatches.Items.Add(j),这必然触发空引用异常——你没法对一个不存在的ListBox实例操作它的Items集合。而且其实你根本不需要用ListBox来存匹配结果,直接用正则的匹配集合或者字符串列表就够了。 - 错误遍历字符串字符:
For Each j As String In columnValues(i)这段代码会把字符串拆成单个字符遍历,而不是你想要的匹配整个字符串里的目标内容,这完全偏离了你的需求。 - 不合理的数组使用:每次循环
ReDim Preserve columnValues(i)不仅效率低,而且完全没必要——你可以直接在循环里获取当前行第5列的单元格值,不需要额外存数组。 - 错误赋值单元格:你试图把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
相关产品推荐
相关产品推荐

