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

