C# 截取或匹配字符串内包含指定字符的一些方法
目录核心正则表达式解析方案一提取所有符合条件的地址信息推荐方案二仅提取特定部分的数字如只想要寝室号方案三处理可能存在的格式差异健壮性优化注意事项如果您喜欢此文章请收藏、点赞、评论谢谢祝您快乐每一天。C# 截取或匹配字符串内包含指定字符如5号综合楼3层305寝2号 或 4号综合楼2层205寝1号。针对字符串5号综合楼3层305寝2号或4号综合楼2层205寝1号如果需要提取其中的结构化信息如楼号、楼层、寝室号、床位号最稳健的方法是使用 正则表达式Regex 进行分组捕获。以下是具体的 C# 实现方案分为提取单个结构和提取所有匹配项两种场景。核心正则表达式解析我们需要匹配的模式大致为数字号综合楼数字层数字寝数字号。正则表达式模式(\d)号综合楼(\d)层(\d)寝(\d)号(\d)捕获组匹配一个或多个数字。第1组楼号第2组楼层第3组寝室号第4组床位/房间序号方案一提取所有符合条件的地址信息推荐使用Regex.Matches可以一次性从长字符串中提取出所有符合该格式的地址块。using System;using System.Text.RegularExpressions;using System.Collections.Generic;public class AddressExtractor{// 定义地址数据模型public class DormInfo{public string BuildingNo { get; set; } // 楼号public string Floor { get; set; } // 楼层public string RoomNo { get; set; } // 寝室号public string BedNo { get; set; } // 床位/序号public override string ToString(){return $楼:{BuildingNo}, 层:{Floor}, 寝:{RoomNo}, 号:{BedNo};}}public static ListDormInfo ExtractAllAddresses(string input){var results new ListDormInfo();if (string.IsNullOrEmpty(input)) return results;// 正则解释// (\d) - 捕获楼号// 号综合楼 - 固定文字// (\d) - 捕获楼层// 层 - 固定文字// (\d) - 捕获寝室号// 寝 - 固定文字// (\d) - 捕获床位号// 号 - 固定文字string pattern (\d)号综合楼(\d)层(\d)寝(\d)号;// 查找所有匹配项MatchCollection matches Regex.Matches(input, pattern);foreach (Match match in matches){if (match.Success){results.Add(new DormInfo{BuildingNo match.Groups.Value, // 第1个括号内的内容Floor match.Groups.Value, // 第2个括号内的内容RoomNo match.Groups.Value, // 第3个括号内的内容BedNo match.Groups.Value // 第4个括号内的内容});}}return results;}}// 调用示例class Program{static void Main(){string text 5号综合楼3层305寝2号或4号综合楼2层205寝1号;var addresses AddressExtractor.ExtractAllAddresses(text);foreach (var addr in addresses){Console.WriteLine(addr.ToString());}}}输出结果楼:5, 层:3, 寝:305, 号:2楼:4, 层:2, 寝:205, 号:1方案二仅提取特定部分的数字如只想要寝室号如果你只关心“305”和“205”这样的寝室号可以使用更简单的正则或 LINQ。using System;using System.Linq;using System.Text.RegularExpressions;public class SimpleExtractor{public static void Main(){string text 5号综合楼3层305寝2号或4号综合楼2层205寝1号;// 方法匹配 数字寝 中的数字// 模式(\d)寝 - 捕获寝字前面的数字string pattern (\d)寝;var roomNumbers Regex.Matches(text, pattern).CastMatch().Select(m m.Groups.Value).ToList();Console.WriteLine(提取到的寝室号: string.Join(, , roomNumbers));// 输出: 提取到的寝室号: 305, 205}}方案三处理可能存在的格式差异健壮性优化如果实际数据中“号综合楼”可能简写为“号楼”或者“层”字可能缺失建议优化正则使其更灵活。优化后的正则(\d)号(?:综合)?楼(\d)层?(\d)寝(\d)号?(?:综合)?非捕获组综合二字出现0次或1次。层?层字出现0次或1次防止有些数据写成 3楼305寝。号?末尾的号字可选。// 示例代码片段string flexiblePattern (\d)号(?:综合)?楼(\d)层?(\d)寝(\d)号?;MatchCollection matches Regex.Matches(input, flexiblePattern);// 后续处理逻辑同上注意事项全角数字问题如果输入可能包含全角数字如“号”\d默认在 .NET 中通常能匹配 Unicode 数字但为了保险起见可以在正则前加上RegexOptions.ECMAScript强制只匹配 ASCII 数字或者手动扩展字符集[0-9-]。性能优化如果需要在循环中频繁执行提取建议将Regex对象声明为static readonly以避免每次重复编译正则表达式。private static readonly Regex AddressRegex new Regex((\d)号综合楼(\d)层(\d)寝(\d)号, RegexOptions.Compiled);3.数据验证提取出的字符串是string类型如果需要用于计算或排序建议使用int.TryParse转换为int。如果您喜欢此文章请收藏、点赞、评论谢谢祝您快乐每一天。