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

 更新时间:2026年07月08日 08:41:52   作者:hefeng_aspnet  
在 C# 中,处理包含变化数字的字符串匹配或截取,最灵活且推荐的方式是使用‌正则表达式(Regular Expressions)‌,此外,如果格式非常固定,也可以使用简单的字符串处理方法,所以本文给大家介绍了使用C#截取或匹配字符串内包含指定字符的方法,需要的朋友可以参考下

C# 截取或匹配字符串内包含指定字符,如:层305、层101或305寝、101寝等,其中数字是变化的。

在 C# 中,处理包含变化数字的字符串匹配或截取,最灵活且推荐的方式是使用‌正则表达式(Regular Expressions)‌。此外,如果格式非常固定,也可以使用简单的字符串处理方法。

以下是几种常见场景的解决方案:

1. 使用正则表达式匹配并提取数字(推荐)

正则表达式可以精准地定位“层”或“寝”前后的数字,无论数字是多少位。

场景 A:提取“层”后面的数字(如 “层305” -> 305)

using System;
using System.Text.RegularExpressions;
public class StringHelper
{
    public static string ExtractNumberAfterLayer(string input)
    {
        // 模式解释:
        // "层"   : 匹配 literal 字符 "层"
        // (\d+)  : 捕获组,匹配一个或多个数字
        string pattern = @"层(\d+)";
        Match match = Regex.Match(input, pattern);
        if (match.Success)
        {
            return match.Groups[1].Value; // 返回捕获组中的数字部分
        }
        return null; // 未找到匹配
    }
}

场景 B:提取“寝”前面的数字(如 “305寝” -> 305)

public static string ExtractNumberBeforeQin(string input)
{
    // 模式解释:
    // (\d+)  : 捕获组,匹配一个或多个数字
    // "寝"   : 匹配 literal 字符 "寝"
    string pattern = @"(\d+)寝";
    Match match = Regex.Match(input, pattern);
    if (match.Success)
    {
        return match.Groups[1].Value;
    }
    return null;
}

场景 C:通用提取(同时兼容 “层305” 和 “305寝”)

如果你希望从同一个字符串中提取出那个核心数字,不管它是在“层”后还是“寝”前:

public static string ExtractRoomNumber(string input)
{
    // 模式解释:
    // 要么匹配 "层" 后面的数字,要么匹配 "寝" 前面的数字
    string pattern = @"(?:层)(\d+)|(\d+)(?:寝)";
    Match match = Regex.Match(input, pattern);
    if (match.Success)
    {
        // Group[1] 对应 "层(\d+)" 中的数字
        // Group[2] 对应 "(\d+)寝" 中的数字
        if (!string.IsNullOrEmpty(match.Groups[1].Value))
            return match.Groups[1].Value;
        else if (!string.IsNullOrEmpty(match.Groups[2].Value))
            return match.Groups[2].Value;
    }
    return null;
}

2. 使用Substring和IndexOf(适用于格式极其固定的情况)

如果字符串格式非常严格(例如永远是“层XXX”或“XXX寝”),可以使用传统字符串操作,但容错性较差。

public static string ExtractWithSubstring(string input)
{
    if (input.Contains("层"))
    {
        int index = input.IndexOf("层");
        // 假设数字紧跟在"层"之后,且直到字符串结束或遇到非数字字符
        string remaining = input.Substring(index + 1);
        // 进一步提取纯数字部分
        return new string(remaining.TakeWhile(char.IsDigit).ToArray());
    }
    else if (input.Contains("寝"))
    {
        int index = input.IndexOf("寝");
        // 假设数字在"寝"之前
        string preceding = input.Substring(0, index);
        // 从末尾向前提取纯数字部分
        return new string(preceding.Reverse().TakeWhile(char.IsDigit).Reverse().ToArray());
    }
    return null;
}

3. 完整示例代码

using System;
using System.Text.RegularExpressions;
class Program
{
    static void Main()
    {
        string[] testCases = { "层305", "层101", "305寝", "101寝", "A层305B", "房间305寝" };
        foreach (var test in testCases)
        {
            string number = ExtractRoomNumber(test);
            Console.WriteLine($"输入: {test,-10} => 提取数字: {number}");
        }
    }
    /// <summary>
    /// 通用方法:提取"层"后或"寝"前的数字
    /// </summary>
    static string ExtractRoomNumber(string input)
    {
        if (string.IsNullOrEmpty(input)) return null;
        // 尝试匹配 "层" 后面的数字
        Match matchLayer = Regex.Match(input, @"层(\d+)");
        if (matchLayer.Success)
        {
            return matchLayer.Groups[1].Value;
        }
        // 尝试匹配 "寝" 前面的数字
        Match matchQin = Regex.Match(input, @"(\d+)寝");
        if (matchQin.Success)
        {
            return matchQin.Groups[1].Value;
        }
        return null;
    }
}

输出结果:

输入: 层305       => 提取数字: 305
输入: 层101       => 提取数字: 101
输入: 305寝       => 提取数字: 305
输入: 101寝       => 提取数字: 101
输入: A层305B     => 提取数字: 305
输入: 房间305寝   => 提取数字: 305

关键点总结

  1. 正则表达式 \d+‌:用于匹配一个或多个连续数字,是处理“变化数字”的核心。
  2. 捕获组 ()‌:用于只提取我们关心的数字部分,而不是整个匹配字符串。
  3. Regex.Match‌:用于查找第一个匹配项。如果需要查找所有匹配项(如字符串中有多个房间号),可使用 Regex.Matches
  4. 灵活性‌:正则方案能很好地处理前后有其他字符的情况(如 “A层305B”),而 Substring 方案则需要更复杂的逻辑来确保索引正确。

以上就是C#截取或匹配字符串内包含指定字符的方法的详细内容,更多关于C#截取或匹配字符串指定字符的资料请关注脚本之家其它相关文章!

相关文章

  • 学会使用C#异常

    学会使用C#异常

    在C#中,程序中在运行时出现的错误,会不断在程序中进行传播,这种机制称为“异常”。 异常通常由错误的代码引发,并由能够更正错误的代码进行catch。本文将对C#异常简要分析说明,下面就跟着小编一起来看下吧
    2016-12-12
  • 在 C# 中使用 Span<T> 和 Memory<T> 编写高性能代码的详细步骤

    在 C# 中使用 Span<T> 和 Memory<

    在本文中,将会介绍 C# 7.2 中引入的新类型:Span 和 Memory,文章深入研究 Span<T> 和 Memory<T> ,并演示如何在 C# 中使用它们,需要的朋友可以参考下
    2022-08-08
  • C#委托与事件初探

    C#委托与事件初探

    事件是委托的一种特殊形式,当发生有意义的事情时,事件处理对象通知过程。接下来通过本文给大家介绍C#委托与事件初探,感兴趣的朋友一起学习吧
    2016-02-02
  • C#自动生成漂亮的水晶效果头像的实现代码

    C#自动生成漂亮的水晶效果头像的实现代码

    这篇文章主要介绍了C#自动生成漂亮的水晶效果头像的实现代码,有需要的朋友可以参考一下
    2013-12-12
  • C#中的扩展方法详解

    C#中的扩展方法详解

    “扩展方法使您能够向现有类型“添加”方法,而无需创建新的派生类型、重新编译或以其他方式修改原始类型。”这是msdn上说的,也就是你可以对String,Int,DataRow,DataTable等这些类型的基础上增加一个或多个方法,使用时不需要去修改或编译类型本身的代码。
    2014-09-09
  • C#警惕匿名方法造成的变量共享实例分析

    C#警惕匿名方法造成的变量共享实例分析

    这篇文章主要介绍了C#警惕匿名方法造成的变量共享,以实例形式分析了C#的匿名方法造成变量共享的原因及对应的解决方法,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-11-11
  • C#实现协同过滤算法的实例代码

    C#实现协同过滤算法的实例代码

    这篇文章介绍了C#实现协同过滤算法的实例代码,有需要的朋友可以参考一下
    2013-07-07
  • C#常用知识点简单回顾(有图有真相)

    C#常用知识点简单回顾(有图有真相)

    C#知识点记录编程的点点滴滴,本文整理了一些(传值调用与引用调用/打印三角形/递归求阶乘/多态性..等等),感兴趣的朋友可以了解下的,不要走开(有图有真相)
    2013-01-01
  • C# MVC 微信支付教程系列之扫码支付代码实例

    C# MVC 微信支付教程系列之扫码支付代码实例

    本篇文章主要介绍了C# MVC 微信支付教程系列之扫码支付,非常具有实用价值,需要的朋友可以参考下。
    2016-12-12
  • C#实现日期操作类DateTime的方法示例

    C#实现日期操作类DateTime的方法示例

    C#中日期和时间操作主要通过System.DateTime类实现,提供了创建、格式化、比较和计算等功能,下面就来具体介绍一下,感兴趣的可以了解一下
    2025-03-03

最新评论