You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在不使用正则表达式的情况下移除C#字符串内引号中的双引号

不使用正则移除XML属性值内的多余双引号

问题描述

给定一段存在格式错误的C# XML字符串,其中placename属性值内部错误地包含多余双引号,导致XML结构不合法。需要在不使用正则表达式的前提下,修复这些多余的双引号,得到合法的XML结构。

原始字符串:

string str = 
@"<result>
 <location country=""GR"" placename=""ACB""street""/>
<location country=""GR"" placename=""DFG ""street""/>
<location country=""GR"" placename=""HIJ"" street""/>
</result>
";

期望结果:

string str = 
@"<result>
 <location country=""GR"" placename=""ACBstreet""/>
<location country=""GR"" placename=""DFG street""/>
<location country=""GR"" placename=""HIJ street""/>
</result>
";

实现方案

通过逐字符遍历字符串,结合状态变量追踪XML标签和属性值的上下文,判断并移除属性值内部的多余双引号。具体逻辑如下:

  • 维护两个状态变量:inTag(标记是否处于XML标签内部)、inAttributeValue(标记是否处于属性值的双引号内部)。
  • 遇到标签开始<或结束>时,更新状态并直接保留字符。
  • 标签外的内容直接保留。
  • 标签内遇到双引号时,判断是否为属性值的闭合引号:若下一个字符是属性分隔符(空格、/、>),则保留引号并退出属性值状态;否则视为多余引号,直接跳过。

完整代码

using System.Text;

string originalStr = 
@"<result>
 <location country=""GR"" placename=""ACB""street""/>
<location country=""GR"" placename=""DFG ""street""/>
<location country=""GR"" placename=""HIJ"" street""/>
</result>
";

StringBuilder correctedSb = new StringBuilder();
bool inTag = false;
bool inAttributeValue = false;

for (int i = 0; i < originalStr.Length; i++)
{
    char currentChar = originalStr[i];
    
    if (currentChar == '<')
    {
        correctedSb.Append(currentChar);
        inTag = true;
        inAttributeValue = false;
    }
    else if (currentChar == '>')
    {
        correctedSb.Append(currentChar);
        inTag = false;
        inAttributeValue = false;
    }
    else if (!inTag)
    {
        correctedSb.Append(currentChar);
    }
    else
    {
        if (currentChar == '"')
        {
            if (!inAttributeValue)
            {
                // 进入属性值,保留引号
                correctedSb.Append(currentChar);
                inAttributeValue = true;
            }
            else
            {
                // 判断是否为属性值的闭合引号
                bool isClosingQuote = false;
                if (i + 1 < originalStr.Length)
                {
                    char nextChar = originalStr[i + 1];
                    isClosingQuote = nextChar == ' ' || nextChar == '/' || nextChar == '>';
                }
                else
                {
                    // 字符串末尾的引号视为闭合引号
                    isClosingQuote = true;
                }

                if (isClosingQuote)
                {
                    correctedSb.Append(currentChar);
                    inAttributeValue = false;
                }
                // 多余引号直接跳过,不添加到结果中
            }
        }
        else
        {
            correctedSb.Append(currentChar);
        }
    }
}

string correctedStr = correctedSb.ToString();
// 输出结果即为期望的XML字符串

代码说明

  • 使用StringBuilder进行高效的字符串拼接,避免频繁创建字符串实例带来的性能损耗。
  • 通过状态变量精准控制上下文,确保只处理标签内属性值的多余引号,不会影响标签外的内容。
  • 逻辑清晰,完全不依赖正则表达式,适用于结构相对固定的XML格式修复场景。

内容的提问来源于stack exchange,提问作者Samuel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 19:05:17