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

目录

方案一:提取完整的组合字符串(推荐)

方案二:分别提取"层数"和"寝室号"的数字

方案三:灵活提取特定格式(通用工具方法)

总结


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

C# 提取、截取或匹配字符串内包含指定字符,如:5号综合楼3层305寝2号或4号综合楼2层205寝1号。

针对字符串 "5号综合楼3层305寝2号或4号综合楼2层205寝1号",提取"层+数字"(如 层305)或"数字+寝"(如 305寝)这类组合,核心在于使用‌正则表达式的捕获组‌。

以下是几种针对不同需求的 C# 实现方案:

方案一:提取完整的组合字符串(推荐)

如果你希望直接得到 "层305""305寝" 这样的完整子串,可以使用"或"逻辑的正则。

using System;

using System.Text.RegularExpressions;

using System.Collections.Generic;

public class Extractor

{

public static List<string> ExtractCombinations(string input)

{

var results = new List<string>();

if (string.IsNullOrEmpty(input)) return results;

// 正则解释:

// (层\d+) : 匹配 "层" 后面跟着数字,例如 "层305"

// | : 或者

// (\d+寝) : 匹配 数字 后面跟着 "寝",例如 "305寝"

string pattern = @"(层\d+)|(\d+寝)";

MatchCollection matches = Regex.Matches(input, pattern);

foreach (Match match in matches)

{

// match.Value 会返回整个匹配到的文本(无论是 "层305" 还是 "305寝")

if (match.Success)

{

results.Add(match.Value);

}

}

return results;

}

}

// 调用示例

class Program

{

static void Main()

{

string text = "5号综合楼3层305寝2号或4号综合楼2层205寝1号";

var items = Extractor.ExtractCombinations(text);

// 输出: 层305, 305寝, 层205, 205寝

Console.WriteLine(string.Join(", ", items));

}

}

方案二:分别提取"层数"和"寝室号"的数字

如果你需要将"层"和"寝"分开处理,或者只想要纯数字,可以使用分组捕获。

using System;

using System.Text.RegularExpressions;

public class DetailedExtractor

{

public class RoomInfo

{

public string FloorPart { get; set; } // 例如: "层305"

public int FloorNum { get; set; } // 例如: 305

public string RoomPart { get; set; } // 例如: "305寝"

public int RoomNum { get; set; } // 例如: 305

}

public static List<RoomInfo> ExtractDetails(string input)

{

var results = new List<RoomInfo>();

// 这里我们假设一个完整的地址结构来一次性提取,这样能对应上哪层是哪个寝

// 模式: ...层(数字)...(数字)寝...

string pattern = @"层(\d+).+?(\d+)寝";

// 注意:如果字符串里有多个地址,上面的简单正则可能会跨地址匹配。

// 更严谨的做法是分别提取,或者使用更复杂的非贪婪匹配。

// 为了演示简单提取所有"层X"和"Y寝":

// 1. 提取所有 "层+数字"

var floorMatches = Regex.Matches(input, @"层(\d+)");

// 2. 提取所有 "数字+寝"

var roomMatches = Regex.Matches(input, @"(\d+)寝");

// 由于原字符串结构对称,我们可以假设第i个层对应第i个寝

int count = Math.Min(floorMatches.Count, roomMatches.Count);

for(int i=0; i<count; i++)

{

results.Add(new RoomInfo

{

FloorPart = "层" + floorMatchesi.Groups.Value,

FloorNum = int.Parse(floorMatchesi.Groups.Value),

RoomPart = roomMatchesi.Groups.Value + "寝",

RoomNum = int.Parse(roomMatchesi.Groups.Value)

});

}

return results;

}

}

方案三:灵活提取特定格式(通用工具方法)

如果你只需要一个通用的方法,传入关键字(如"层"或"寝")来提取相邻数字:

using System;

using System.Text.RegularExpressions;

using System.Collections.Generic;

public class FlexibleExtractor

{

/// <summary>

/// 提取指定关键字前后的数字组合

/// </summary>

/// <param name="input">源字符串</param>

/// <param name="keyword">关键字,如 "层" 或 "寝"</param>

/// <param name="position">"Before"表示数字在关键字前(305寝),"After"表示数字在关键字后(层305)</param>

public static List<string> ExtractByKeyword(string input, string keyword, string position = "After")

{

var results = new List<string>();

if (string.IsNullOrEmpty(input)) return results;

string pattern = "";

if (position.Equals("After", StringComparison.OrdinalIgnoreCase))

{

// 匹配: 关键字 + 数字 (例如: 层305)

// \Q...\E 用于转义关键字中的特殊字符,虽然中文通常不需要,但这是好习惯

pattern = $@"({Regex.Escape(keyword)}\d+)";

}

else

{

// 匹配: 数字 + 关键字 (例如: 305寝)

pattern = $@"(\d+{Regex.Escape(keyword)})";

}

MatchCollection matches = Regex.Matches(input, pattern);

foreach (Match match in matches)

{

results.Add(match.Groups.Value);

}

return results;

}

}

// 调用示例

class Program

{

static void Main()

{

string text = "5号综合楼3层305寝2号或4号综合楼2层205寝1号";

// 提取 "层305", "层205"

var floors = FlexibleExtractor.ExtractByKeyword(text, "层", "After");

Console.WriteLine("层信息: " + string.Join(", ", floors));

// 输出: 层信息: 层305, 层205

// 提取 "305寝", "205寝"

var rooms = FlexibleExtractor.ExtractByKeyword(text, "寝", "Before");

Console.WriteLine("寝信息: " + string.Join(", ", rooms));

// 输出: 寝信息: 305寝, 205寝

}

}

总结

  • 最简单直接 ‌:使用方案一的正则 (层\d+)|(\d+寝),它可以一次性把所有符合这两种格式的片段都找出来。
  • 最灵活‌:使用方案三,通过参数控制是提取"前数字"还是"后数字",代码复用性高。
  • 关键点 ‌:\d+ 代表匹配任意长度的连续数字,这解决了你提到的"数字是变化的"这一需求。

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

相关推荐
枳实-叶4 小时前
【Linux驱动开发】第23天:spi_driver 的 probe / remove 函数实现规范
linux·驱动开发·c#
长明5 小时前
C#项目组织与概念梳理
后端·c#
迷路爸爸1805 小时前
Python collections 入门+实战
windows·python·c#·collections·dict
csdn_aspnet5 小时前
C# 截取或匹配字符串内包含指定字符的一些方法
c#·字符串·分割·string·匹配·截取
Rotion_深6 小时前
C# 值类型与引用类型 详解
开发语言·jvm·c#
影寂ldy17 小时前
C# try-catch 异常处理全套笔记
服务器·数据库·c#
TeamDev18 小时前
JxBrowser 9.3.0 版本发布啦!
java·后端·c#·混合应用·jxbrowser·浏览器控件·异步媒体设备
梦帮科技18 小时前
UE5 GAS 实战:用 Gameplay Ability System 搭建「赛博修真」境界与技能体系
c++·人工智能·python·ue5·c#
北域码匠1 天前
RIPEMD-128哈希算法深度解析
c#·密码学·哈希算法·加密算法·消息摘要·ripemd-128·原生实现