如何在不使用正则表达式的情况下移除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
相关产品推荐
相关产品推荐

