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

C#如何让Regex.Split的分隔符保留在所有结果子串中?

解决办法

方案1:用正则匹配(更直接)

不用分割,直接匹配出包含分隔符的两段内容就行。针对你的例子,正则表达式写这样:

.*?\*|\*.*

解释下:

  • .*?\*:从字符串开头匹配到第一个*,并且把*包含进去(.*?是最短匹配,避免把后面的内容也吞掉)
  • |\*.*:或者从*开始匹配到字符串结尾,同样包含*

拿C#举个例子:

string input = "holidays/*/2024";
string pattern = @".*?\*|\*.*";
var result = Regex.Matches(input, pattern)
                  .Cast<Match>()
                  .Select(m => m.Value)
                  .ToArray();
// 跑出来结果就是 ["holidays/*", "*/2024"]

方案2:Regex.Split加简单拼接

如果你非得用Regex.Split,可以这么搞:
要么先用正后顾(?<=\*)分割,得到["holidays/*", "/2024"],然后给第二个元素前面加上*;要么用正前瞻(?=\*)分割,得到["holidays/", "*2024"],给第一个元素后面加*。

代码示例(正后顾的版本):

string input = "holidays/*/2024";
char delimiter = '*';
var splitResult = Regex.Split(input, $@"(?<=\{delimiter})");
var finalResult = new[] { splitResult[0], $"{delimiter}{splitResult[1]}" };
// 结果就是你要的 ["holidays/*", "*/2024"]

为啥直接组合前后断言不行?

要是直接写(?<=\*)|(?=\*)当分割模式,会得到三个元素:["holidays/", "*", "/2024"]——因为这个模式会在*的前后各切一刀,把*单独拆出来了,不符合你的需求。这种情况还得额外拼接,反而不如直接匹配省事。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 22:25:29