如何提取相同首尾标识符间的子字符串?IndexOf/Split方法遇困
解决双引号间内容提取的问题
嘿,这个场景我太熟了!其实不用纠结,有好几种简单靠谱的办法能搞定你这个需求——从.0.label unicode "Area - 110"里精准提取双引号之间的文本。
方法一:用IndexOf指定起始位置(最直观)
你之前担心IndexOf会返回相同值,其实只要用它的重载方法,指定第二个引号的搜索起始位置就行,完全不会重复匹配第一个引号:
string input = @".0.label unicode ""Area - 110"" "; // 找到第一个双引号的索引 int firstQuoteIndex = input.IndexOf('"'); if (firstQuoteIndex != -1) { // 从第一个引号的下一个位置开始找第二个引号 int secondQuoteIndex = input.IndexOf('"', firstQuoteIndex + 1); if (secondQuoteIndex != -1) { // 截取两个引号之间的内容 string extractedText = input.Substring(firstQuoteIndex + 1, secondQuoteIndex - firstQuoteIndex - 1); Console.WriteLine(extractedText); // 输出:Area - 110 } }
这个方法逻辑清晰,性能也不错,适合处理简单或大量字符串的场景。
方法二:正则表达式(最灵活)
如果以后遇到更复杂的格式(比如字符串里可能有转义引号之类的),正则表达式会是更通用的选择,它能精准匹配成对的双引号内容:
using System.Text.RegularExpressions; string input = @".0.label unicode ""Area - 110"" "; // 用非贪婪匹配捕获双引号间的内容 Match matchResult = Regex.Match(input, @"""(.*?)"""); if (matchResult.Success) { string extractedText = matchResult.Groups[1].Value; Console.WriteLine(extractedText); // 输出:Area - 110 }
这里的"(.*?)"是核心:"匹配双引号,(.*?)是非贪婪模式的捕获组,会尽可能短地匹配两个引号之间的所有内容,完美适配你说的“内容长度不固定”的情况。
方法三:Split方法(最简洁)
其实Split也能搞定,你之前担心的索引问题根本不存在——按双引号分割后,目标内容刚好是数组的第二个元素:
string input = @".0.label unicode ""Area - 110"" "; string[] splitParts = input.Split('"'); // 只要分割后数组元素数量足够,直接取索引1的元素 if (splitParts.Length >= 2) { string extractedText = splitParts[1]; Console.WriteLine(extractedText); // 输出:Area - 110 }
这个方法代码最少,适合快速实现简单需求。
内容的提问来源于stack exchange,提问作者Ben
相关产品推荐
相关产品推荐

