如何提取字符串中[]内的内容?代码存在异常行为
提取字符串中[]内容的异常修复方案
你的代码出现异常的核心原因是:没有对[和]的位置有效性做检查。当字符串里找不到[/],或者]出现在[前面时,IndexOf会返回-1,这时候计算出来的起始位置或长度会是负数,调用Substring就会触发参数错误。哪怕是你例子里的合法字符串,一旦遇到格式不规范的行(比如只有[没有]),同样会出问题。
下面给你两种实用的改进方案:
方案一:基于原代码增加合法性校验
在提取子串前先确认括号的位置是否合法,避免无效计算:
For Each a As String In CType(TabControl1.SelectedTab.Controls.Item(0), RichTextBox).Text.Split(System.Environment.NewLine()) If a.Contains("print ") Then Dim sData As String = a.Substring(6) Dim openIdx As Integer = sData.IndexOf("[") Dim closeIdx As Integer = sData.IndexOf("]") ' 先检查括号是否存在且顺序正确 If openIdx <> -1 AndAlso closeIdx <> -1 AndAlso closeIdx > openIdx Then Dim startPos As Integer = openIdx + 1 ' 跳过左括号 Dim contentLength As Integer = closeIdx - startPos Dim sData1 As String = sData.Substring(startPos, contentLength) Console.WriteLine(sData1) Else ' 可选:处理格式错误的情况 Console.WriteLine($"该行「{a}」格式无效,未找到合法的[]对") End If End If Next
方案二:用正则表达式更高效可靠
正则表达式可以精准匹配[]包裹的内容,即使字符串后面有额外干扰字符(比如你例子里的" pri...")也能轻松提取,还能处理更复杂的场景:
Imports System.Text.RegularExpressions For Each a As String In CType(TabControl1.SelectedTab.Controls.Item(0), RichTextBox).Text.Split(System.Environment.NewLine()) If a.Contains("print ") Then Dim sData As String = a.Substring(6) ' 正则匹配:捕获[和]之间的所有非]字符 Dim matchResult As Match = Regex.Match(sData, "\[([^\]]*)\]") If matchResult.Success Then Dim extractedContent As String = matchResult.Groups(1).Value Console.WriteLine(extractedContent) Else Console.WriteLine($"未从「{sData}」中提取到有效内容") End If End If Next
这里的正则\[([^\]]*)\]逻辑很简单:
\[:匹配转义后的左括号[(因为[在正则里是特殊符号)([^\]]*):捕获组,匹配任意**不是右括号]**的字符(*表示允许0个或多个)\]:匹配转义后的右括号]
这种方式不仅能处理你当前的场景,还能兼容比如print [Hello] [World]这种多组括号的情况(如果需要提取所有组,把Match换成Matches即可)。
内容的提问来源于stack exchange,提问作者DDev
相关产品推荐
相关产品推荐

