news 2026/7/5 15:19:33

C# 截取或匹配字符串内包含指定字符的一些方法

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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 List<DormInfo> ExtractAllAddresses(string input)
{
var results = new List<DormInfo>();
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)
.Cast<Match>()
.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);
// 后续处理逻辑同上

注意事项

全角数字问题‌:如果输入可能包含全角数字(如“5号”),\d默认在 .NET 中通常能匹配 Unicode 数字,但为了保险起见,可以在正则前加上RegexOptions.ECMAScript强制只匹配 ASCII 数字,或者手动扩展字符集[0-90-9]。‌

性能优化‌:如果需要在循环中频繁执行提取,建议将Regex对象声明为static readonly,以避免每次重复编译正则表达式。

private static readonly Regex AddressRegex = new Regex(@"(\d+)号综合楼(\d+)层(\d+)寝(\d+)号", RegexOptions.Compiled);

3‌.数据验证‌:提取出的字符串是string类型,如果需要用于计算或排序,建议使用int.TryParse转换为int

如果您喜欢此文章,请收藏、点赞、评论,谢谢,祝您快乐每一天。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/5 15:19:09

IDEA git 暂存代码和恢复代码

注意&#xff1a;使用的是IDEA 2025.3.4版本&#xff0c;不同版本操作界面会略有不同。在一个分支进行开发&#xff0c;代码未达到提交标准&#xff0c;需要切换到另一分支时。用 git stash&#xff08;储藏&#xff09;&#xff0c;把当前未提交的代码临时存起来 → 切分支 →…

作者头像 李华
网站建设 2026/7/5 15:17:08

SARSteer: Safeguarding Large Audio Language Models via Safe-Ablated Refusal Steering

文章核心总结与翻译 一、主要内容 本文聚焦大型音频语言模型(LALMs)的安全对齐问题,针对现有LLM和LVLM安全防御方法直接迁移至LALMs时存在的两大缺陷(音频输入下基于LLM的引导失效、基于提示的防御导致良性查询过度拒绝),提出了首个推理时防御框架SARSteer(Safe-Ablat…

作者头像 李华
网站建设 2026/7/5 15:15:57

From Local to Global: Revisiting Structured Pruning Paradigms for Large Language Models

文章总结与翻译 一、主要内容 本文聚焦大型语言模型(LLMs)的结构化剪枝技术,针对主流局部剪枝范式任务无关、下游性能提升有限的问题,重新审视全局结构化剪枝并提出GISP(Global Iterative Structured Pruning) 方法。 核心背景 结构化剪枝因能生成硬件友好的紧凑架构,…

作者头像 李华
网站建设 2026/7/5 15:12:37

Low-Resource Dialect Adaptation of Large Language Models: A French Dialect Case-Study

文章主要内容与创新点总结 一、主要内容 本文聚焦低资源方言的大语言模型(LLM)适配问题,以魁北克法语(Qubcois)为案例,研究在有限数据和计算资源下,通过持续预训练(CPT)结合参数高效微调(PEFT)技术实现方言适配的可行性。 研究背景:主流LLM多基于高资源标准语(如…

作者头像 李华
网站建设 2026/7/5 15:12:23

遇见的问题以及解决措施

1、问题&#xff1a;‘make_unique’ is not a member of ‘std’解决方法&#xff1a;g -stdc14 your_code.cpp -o your_program 或 g -stdc17 your_code.cpp -o your_program2、VScode 如何用gdb调试&#xff08;1&#xff09;步骤总结&#xff08;2&#xff09;配置 launch.…

作者头像 李华