使用Strings.InStr或IndexOf查找子串无结果的问题排查
问题分析与解决
你定义的字符串为:
Dim str As String = "A.090173.R-G1 00 NR 1,00 5 BAR (desc) * SEE NOTE : Mat. 17K Dim. xx*yy mm"
尝试判断是否存在子串.090173.R-G,但InStr返回0、IndexOf返回-1、Contains返回False,核心原因是表面看起来相同的字符,实际编码不一致,常见场景包括:
- 非标准标点/符号:比如原字符串中的连字符
-可能是长破折号(Unicode U+2013)、全角连字符,而你定义的ssf用的是标准半角连字符(ASCII 45);或者原字符串中的.是全角点(Unicode U+FF0E),而非半角点(ASCII 46)。 - 隐藏不可见字符:原字符串的目标片段中夹杂了零宽空格、制表符等肉眼无法识别的空白字符,导致匹配失败。
排查方法
可以通过输出每个字符的Unicode编码来定位差异,示例代码:
' 打印原字符串的字符及编码 Console.WriteLine("原字符串字符编码:") For Each c As Char In str Console.WriteLine($"字符: '{c}', 编码: {AscW(c)}") Next ' 打印目标子串的字符及编码 Console.WriteLine(vbCrLf & "目标子串字符编码:") For Each c As Char In ssf Console.WriteLine($"字符: '{c}', 编码: {AscW(c)}") Next
对比两组编码,就能找到不一致的字符位置。
解决办法
- 修正目标子串:根据排查出的编码差异,将
ssf中的字符替换为原字符串对应的编码字符。 - 清洗原字符串:如果原字符串存在大量非标准字符,可以统一替换为标准字符,比如:
' 替换非标准连字符为半角连字符 str = str.Replace(ChrW(&H2013), "-").Replace(ChrW(&H2014), "-") ' 替换全角点为半角点 str = str.Replace(ChrW(&HFF0E), ".")
之后再执行匹配操作即可。
内容的提问来源于stack exchange,提问作者Gianfranco Vrech
相关产品推荐
相关产品推荐

