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

