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

C#中拆分句子的正则表达式异常:末尾字符丢失问题排查

解决C#正则拆分句子时末尾字符丢失的问题

问题原因

你用的正则模式"[^\.\!\?] *[\.\!\?]"逻辑有误:

  • [^\.\!\?]仅匹配单个非标点字符
  • 后面的*是修饰空格的,而非修饰非标点字符
    这导致正则会把「单个非标点字符+零或多个空格+标点」当成分隔符,Split时这些片段被移除,自然丢失了句子的最后一个字符。

解决方案

方案1:用正向后瞻实现正确拆分(保留标点)

用正向后瞻匹配标点后的位置,Split不会移除任何有效内容,直接拆分出完整带标点的句子:

string input = "Lorem ipsum dolor sit amet. Nam autem doloribus ut perspiciatis omnis est ratione quidem!";
// 匹配标点(.!?)后的位置,后续空格可选
string pattern = @"(?<=[\.\!\?])\s*";
string[] sentences = Regex.Split(input, pattern);
// 输出结果:
// ["Lorem ipsum dolor sit amet.", "Nam autem doloribus ut perspiciatis omnis est ratione quidem!"]

方案2:直接匹配提取无标点的句子

如果不需要保留末尾标点,用Matches直接提取符合要求的句子内容更直观:

string input = "Lorem ipsum dolor sit amet. Nam autem doloribus ut perspiciatis omnis est ratione quidem!";
// 匹配所有直到标点前的非标点内容
string pattern = @"[^\.\!\?]+(?=[\.\!\?])";
MatchCollection matches = Regex.Matches(input, pattern);
string[] sentences = matches.Cast<Match>()
                            .Select(m => m.Value.Trim()) // 去除句子前后多余空格
                            .ToArray();
// 输出结果:
// ["Lorem ipsum dolor sit amet", "Nam autem doloribus ut perspiciatis omnis est ratione quidem"]

原正则失效的具体原因

拿"amet."举例,原正则会匹配"t. "(单个非标点t+空格+.)作为分隔符,Split时这段被移除,剩下的内容就变成了"ame",这就是末尾字符丢失的根源。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 02:30:52