VB正则匹配结果内字符替换失效,如何实现目标替换?
问题分析与解决方案
你的代码未生效有两个核心问题:
- VB中字符串是不可变类型,
Regex.Replace不会修改原字符串,必须把返回值重新赋值给变量才会生效 - 原代码是全局替换所有
<,没有限制只替换<rrm:title>标签内部的内容,且遍历匹配项的逻辑也不对
正确实现方式
直接用正则匹配完整的<rrm:title>标签,通过MatchEvaluator仅处理标签内部的内容,替换其中的特殊字符:
Public Function DelEscapeCharacters(ByVal src As String) As String Try ' 匹配完整<rrm:title>标签,捕获内部内容 Dim pattern As String = "<rrm:title>(.*?)</rrm:title>" ' 用Regex.Replace结合处理函数替换标签内部内容 src = Regex.Replace(src, pattern, AddressOf ReplaceTitleContent) Return src Catch ex As Exception ' 建议添加异常处理逻辑,比如返回原字符串或抛出异常 Return src End Try End Function Private Function ReplaceTitleContent(ByVal match As Match) As String ' 获取标签内的原始内容 Dim innerContent As String = match.Groups(1).Value ' 替换内部特殊字符为XML转义符 innerContent = innerContent.Replace("<", "<") innerContent = innerContent.Replace(">", ">") innerContent = innerContent.Replace("""", """) innerContent = innerContent.Replace("'", "'") innerContent = innerContent.Replace("&", "&") ' 重新拼接成完整标签返回 Return $"<rrm:title>{innerContent}</rrm:title>" End Function
代码说明
- 正则
<rrm:title>(.*?)</rrm:title>会匹配完整标签,并将内部内容捕获到Groups(1)中 ReplaceTitleContent方法专处理捕获到的内部内容,仅替换标签内的特殊字符- 关键操作:将
Regex.Replace的返回值赋值回src——因字符串不可变,必须接收新生成的字符串才会生效
原代码失效原因
- 原代码中
Regex.Replace(src, "<", "test")仅生成新字符串,但未赋值给src,原字符串始终未改变 - 即使完成赋值,原逻辑是全局替换所有
<,会把标签本身的<也替换掉,不符合需求
内容的提问来源于stack exchange,提问作者Mark Mullen
相关产品推荐
相关产品推荐

