You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#中Regex.Matches提取含<>与()的目标子串问题

嘿,我知道你在VS2017里用.NET Framework 4.7.1开发C#类库时遇到了正则拆分的问题——要把那三个特定字符串拆成包含括号在内的数组对吧?我来给你一个简单有效的解决方案!

核心思路

我们需要让正则表达式同时匹配两种元素:

  • 被尖括号包裹的标记(比如<expr>、<op>这类)
  • 单独的左括号(或右括号)

通过捕获这两类匹配项,就能直接得到你需要的拆分结果。

关键正则表达式

这里用的正则模式是:

(<[^>]+>|[()])

模式解析:

  • <[^>]+>:匹配以<开头、>结尾的字符串,[^>]+表示匹配任意非>的字符(确保不会跨多个尖括号标记)
  • [()]:匹配单个的(或)字符
  • 整个模式用括号分组,确保Regex.Matches能捕获到每一个独立的目标元素

C# 代码实现

直接上可运行的代码,你可以把这段逻辑集成到你的类库中:

using System;
using System.Linq;
using System.Text.RegularExpressions;

public class StringSplitter
{
    public static string[] SplitExpression(string input)
    {
        // 定义正则模式
        var pattern = @"(<[^>]+>|[()])";
        var regex = new Regex(pattern);
        
        // 获取所有匹配项并转换为字符串数组
        return regex.Matches(input)
                    .Cast<Match>()
                    .Select(m => m.Value)
                    .ToArray();
    }

    // 测试用例
    public static void Main()
    {
        // 测试1:无括号的表达式
        var result1 = SplitExpression("<expr><op><expr>");
        Console.WriteLine($"测试1结果: [{string.Join(", ", result1)}]");
        
        // 测试2:带外层括号的表达式
        var result2 = SplitExpression("(<expr><op><expr>)");
        Console.WriteLine($"测试2结果: [{string.Join(", ", result2)}]");
        
        // 测试3:带前缀操作符的表达式
        var result3 = SplitExpression("<pre_op>(<expr>)");
        Console.WriteLine($"测试3结果: [{string.Join(", ", result3)}]");
    }
}

测试结果验证

运行这段代码后,你会得到完全符合预期的输出:

  • 测试1输出:[<expr>, <op>, <expr>]
  • 测试2输出:[(, <expr>, <op>, <expr>, )]
  • 测试3输出:[<pre_op>, (, <expr>, )]

扩展说明

如果之后需要匹配其他类似的单个符号(比如{、}或者[、]),只需要修改正则里的[()]部分,比如改成[(){}]就能同时匹配括号和大括号了。

内容的提问来源于stack exchange,提问作者VansFannel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 04:30:44