VB.NET 是否存在可提取两个指定字符串间内容的内置函数?
VB.NET 字符串区间提取的内置能力说明
首先给你明确的结论:
- VB.NET 没有专门封装的、拿来就能用的内置函数,可以直接实现“从指定偏移位置开始,抓取两个自定义字符串之间的内容,同时返回下一次查找的起始下标”这类需求。
- 你写的这个
getBetween函数,本身就是靠框架原生的基础字符串方法拼出来的,逻辑清晰、完全能用,已经覆盖了这类场景的常规需求。
可用来简化实现的框架自带能力
虽然没有专门的高层封装,但你完全可以用内置的两类API写出等效甚至更稳的实现,不用引入任何第三方组件:
- 原生字符串基础方法
你代码里用到的String.IndexOf(查找指定字符串位置)、String.Substring(截取指定区间的子串),就是框架提供的最底层的字符串操作原子能力。框架之所以不往上再封一层“两分隔符抓内容”的方法,是因为这类场景的边界规则实在太杂:比如找不到分隔符时是抛错还是返回空、遇到嵌套分隔符要匹配哪一层、要不要忽略大小写、要不要跳过转义的分隔符——根本不存在能适配所有人需求的通用实现,所以框架只把最基础的查找、截取能力开放出来,具体逻辑交给开发者组合。 - 内置正则表达式类
框架自带的System.Text.RegularExpressions.Regex可以把同类逻辑写得更简洁,不需要手动跟踪查找的偏移位置,还能更灵活地处理各种边界情况。
对应你测试场景的参考写法:
用正则实现还有个好处:不会像你原函数那样,一旦' 转义自定义分隔符里的正则特殊字符,避免语法冲突 Dim pattern As String = Regex.Escape(startSearch) & "(.*?)" & Regex.Escape(endSearch) ' 一次匹配所有符合规则的区间 For Each m As Match In Regex.Matches(strSource, pattern) ' Groups(1)就是两个分隔符中间的内容 Dim currentContent = m.Groups(1).Value ' 匹配结束的位置,就是你原函数返回的nextIndex Dim nextSearchIndex = m.Index + m.Length NextIndexOf返回-1(找不到分隔符)就直接触发索引越界异常,可以很方便地加规则忽略无效匹配,程序的鲁棒性更强。
对你现有实现的小优化建议
你设计的三组测试已经覆盖了多字符分隔符、嵌套分隔符的常见场景,当前的getBetween只要补个边界判断就很完善了:
' 在函数开头加判断,找不到起始/结束标记时返回明确的空值,避免崩溃 Dim IndexStart = strSource.IndexOf(startSearch, startSearchIndex) If IndexStart < 0 Then Return (startSearchIndex, String.Empty) Dim indexEnd = strSource.IndexOf(endSearch, IndexStart + startSearch.Length) If indexEnd < 0 Then Return (strSource.Length, String.Empty)
内容的提问来源于stack exchange,提问作者Vibi Chrisbud
相关产品推荐
相关产品推荐

