使用SubString与IndexOf提取值时出现异常结果的问题
问题排查与修复方案
你的代码提取金额时带出了Net字样,核心原因是你假设金额后面会有空格作为结束标记,但目标文本中$29.00和后续的Net之间没有空格,导致IndexOf(" ", vIndexStart)找到的是Net之后的空格,提取范围错误包含了 Net。
以下是三种针对性修复方案:
方案1:遍历字符匹配金额边界
从起始位置开始,只保留数字、$和.字符,遇到其他字符就停止,精准截取金额:
vIndexStart = vOutput.IndexOf(vNet) + vNet.Length If vIndexStart < 0 Then Return Json("<p>There was an Error with " & vNet & "not appearing in the invoice text</p>" & vCheck) End If ' 定位第一个非金额相关字符的索引 vIndexEnd = vIndexStart While vIndexEnd < vOutput.Length AndAlso (Char.IsDigit(vOutput(vIndexEnd)) OrElse vOutput(vIndexEnd) = "$"c OrElse vOutput(vIndexEnd) = "."c) vIndexEnd += 1 End If If vIndexEnd <= vIndexStart Then Return Json("<p>Failed to extract valid Net amount</p>" & vCheck) End If Dim vNetString As String = vOutput.Substring(vIndexStart, vIndexEnd - vIndexStart) SB.Append("<p>Amount Net - " & vNetString & "</p>")
方案2:正则表达式提取(更简洁稳定)
利用正则直接匹配Net Total 后的金额格式,适用于固定格式的发票文本:
Dim regex As New Regex(vNet & "(\$[\d\.]+)") Dim match As Match = regex.Match(vOutput) If match.Success Then Dim vNetString As String = match.Groups(1).Value SB.Append("<p>Amount Net - " & vNetString & "</p>") Else Return Json("<p>There was an Error with " & vNet & " not appearing or invalid amount format</p>" & vCheck) End If
方案3:针对当前文本结构定位Net位置
如果确定金额后紧跟Net,直接用Net的起始索引作为结束标记:
vIndexStart = vOutput.IndexOf(vNet) + vNet.Length If vIndexStart < 0 Then Return Json("<p>There was an Error with " & vNet & "not appearing in the invoice text</p>" & vCheck) End If vIndexEnd = vOutput.IndexOf("Net", vIndexStart) If vIndexEnd < 0 Then Return Json("<p>Failed to find expected 'Net' after amount</p>" & vCheck) End If ' Trim去除可能存在的空白字符 Dim vNetString As String = vOutput.Substring(vIndexStart, vIndexEnd - vIndexStart).Trim() SB.Append("<p>Amount Net - " & vNetString & "</p>")
内容的提问来源于stack exchange,提问作者gchq
相关产品推荐
相关产品推荐

