C#如何提取字符串中两个指定字符串间的所有匹配内容
提取字符串中所有STRING与END之间内容的方法
嘿,我来帮你解决这个提取多个匹配项的问题~你之前的代码只能拿到第一个结果,是因为用了IndexOf(定位第一个STRING)和LastIndexOf(定位最后一个END),这样会把中间所有内容都裹进去,没法拆分出多组配对的内容。这里给你两种靠谱的解决办法:
方法一:用正则表达式(最简洁高效)
正则可以轻松捕获所有符合STRING...END模式的内容,代码量少还灵活。你需要用到System.Text.RegularExpressions命名空间里的Regex.Matches方法,它会返回所有匹配的结果。
完整代码示例
using System; using System.Text.RegularExpressions; class Program { static void Main() { string myString = "This is STRING a222 END, and this is STRING b2838 END."; // 正则模式解析: // STRING:匹配起始标记 // \s*:匹配标记和内容之间可能存在的空格(可选) // (.*?):非贪婪捕获中间的内容,确保只匹配到最近的END为止 // \s*END:匹配结束标记,同样允许中间有空格 string pattern = @"STRING\s*(.*?)\s*END"; MatchCollection matches = Regex.Matches(myString, pattern); // 遍历所有匹配项,提取我们需要的内容 foreach (Match match in matches) { string extractedContent = match.Groups[1].Value.Trim(); // Trim去掉多余空格 Console.WriteLine(extractedContent); } } }
运行这段代码会输出:
a222 b2838
方法二:循环查找标记(不用正则)
如果你不想依赖正则,也可以通过循环逐个查找STRING和对应的END位置,手动提取内容:
完整代码示例
using System; class Program { static void Main() { string myString = "This is STRING a222 END, and this is STRING b2838 END."; string startMarker = "STRING"; string endMarker = "END"; int currentSearchIndex = 0; while (currentSearchIndex < myString.Length) { // 找下一个STRING的位置 int startPos = myString.IndexOf(startMarker, currentSearchIndex); if (startPos == -1) break; // 没有更多STRING了,退出循环 // 计算内容的起始位置(STRING之后) int contentStart = startPos + startMarker.Length; // 找当前STRING后面最近的END位置 int endPos = myString.IndexOf(endMarker, contentStart); if (endPos == -1) break; // 找不到对应的END,退出 // 提取内容并去掉前后空格 string extractedContent = myString.Substring(contentStart, endPos - contentStart).Trim(); Console.WriteLine(extractedContent); // 更新搜索起始位置,从当前END的下一个字符开始 currentSearchIndex = endPos + endMarker.Length; } } }
这个方法的逻辑很直观:每次找到一个STRING后,就找它后面最近的END,提取内容后把搜索起点移到这个END后面,继续找下一组配对,直到找不到更多STRING为止。
内容的提问来源于stack exchange,提问作者RGuest
相关产品推荐
相关产品推荐

