如何在C#中提取以#开头和结尾的子字符串?
在C#中提取被#包裹的子字符串
下面提供两种实用的解决方案,覆盖不同场景需求:
方法一:使用正则表达式(推荐,适合大多数场景)
正则表达式可以快速匹配所有符合#内容#格式的子串,直接提取中间的内容。使用(?<=#)[^#]+(?=#)这个模式,其中:
(?<=#):正向回顾断言,确保匹配内容前面是#[^#]+:匹配任意非#的字符(至少一个)(?=#):正向前瞻断言,确保匹配内容后面是#
示例代码:
using System; using System.Text.RegularExpressions; class Program { static void Main() { string input = "这是一段包含#测试内容#和#另一个示例#的长字符串"; // 匹配所有被#包裹的内容 MatchCollection matches = Regex.Matches(input, @"(?<=#)[^#]+(?=#)"); foreach (Match match in matches) { Console.WriteLine(match.Value); // 输出:测试内容、另一个示例 } } }
如果只需要提取第一个符合条件的子串,用Regex.Match代替Matches,判断Success后获取Value即可。
方法二:手动遍历字符串(无需依赖正则,适合简单场景或需自定义逻辑)
通过字符串索引定位#的位置,手动截取中间内容,适合需要更精细控制的场景(比如处理不规范的配对情况)。
示例代码:
using System; using System.Collections.Generic; class Program { static void Main() { string input = "示例#第一个内容#字符串#第二个内容#结束"; List<string> results = new List<string>(); int startIndex = 0; while (true) { // 找到第一个#的位置 int openHash = input.IndexOf('#', startIndex); if (openHash == -1) break; // 找当前#后面的下一个# int closeHash = input.IndexOf('#', openHash + 1); if (closeHash == -1) break; // 提取中间内容(不包含#) string content = input.Substring(openHash + 1, closeHash - openHash - 1); results.Add(content); // 更新起始位置,继续查找下一组 startIndex = closeHash + 1; } foreach (string item in results) { Console.WriteLine(item); // 输出:第一个内容、第二个内容 } } }
注意事项
- 如果存在嵌套的
#(比如#外层#内层#),两种方法都会提取外层,若需处理嵌套逻辑需额外调整。 - 若字符串中存在单个未配对的
#,两种方法都会自动忽略,避免抛出异常。
内容的提问来源于stack exchange,提问作者vijay.malhi
相关产品推荐
相关产品推荐

