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

为何使用Regex.Split拆分正则表达式时会保留分隔符?

问题分析与解决:Regex.Split保留分隔符的原因及修复方法

嘿,这个问题我太熟了!你遇到的情况是因为Regex.Split对捕获组的处理逻辑——当你在正则里用了带括号的捕获组时,它不仅会用这些匹配内容作为拆分点,还会把捕获到的分隔符本身也放进结果数组里。你的正则(\\s+)|([\\p{P}\\p{S}])里有两个捕获组,所以拆分后;和空格这些分隔符自然就被保留下来了。

要解决这个问题,核心就是告诉正则不要捕获这些分隔符,这里有两个关键步骤:

  • 使用非捕获组替换捕获组:把正则里的(...)改成(?:...),这样分组只用来匹配规则,不会把匹配到的分隔符存入结果数组。
  • 过滤空字符串:拆分后可能会出现空元素(比如分隔符在开头、结尾或者连续出现时),需要额外过滤掉这些无效内容。

修改后的代码如下:

string s = "test;3 régred";
string[] authorsList = Regex.Split(s, "(?:\\s+)|(?:[\\p{P}\\p{S}])")
                           .Where(x => !string.IsNullOrEmpty(x))
                           .ToArray();
foreach (string q in authorsList) { Console.WriteLine(q); }

如果你觉得两个非捕获组有点啰嗦,还可以把它们合并成一个更简洁的写法,效果完全一样:

string[] authorsList = Regex.Split(s, "(?:\\s+|[\\p{P}\\p{S}])")
                           .Where(x => !string.IsNullOrEmpty(x))
                           .ToArray();

运行这段代码后,就能得到你预期的结果:只保留test、3、régred这三个有效内容啦。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 07:19:46