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
相关产品推荐
相关产品推荐

