如何拆分字符串并保留分隔符?

3

我知道你看到了很多类似的问题,但是我希望我的问题有所不同。我正在制作一个翻译器,我想把一段文本分成句子,但当我写下以下代码时:

public static string[] GetSentences(string Text)
{
    if (Text.Contains(". ") || Text.Contains("? ") || Text.Contains("! "))
        return Text.Split(new string[] { ". ", "? ", "! " }, StringSplitOptions.RemoveEmptyEntries);
    else
        return new string[0];
}

它去掉了“.”、“?”、“!”。我想保留它们,怎么做呢?
注意:我想按“。”和空格、“?”和空格进行拆分...

你想要将分隔符保存在数组中吗? - Mivaweb
可能是如何保留Regex.Split的定界符?的重复问题。 - Sadique
我希望分隔符与句子在一起。 - user3260312
也许这不是很好的做法,但你可以在分割后获取数组中每个成员的长度,然后按照长度再次进行分割。 - sdrzymala
2个回答

16

首先,简单地将它们替换掉。我会使用"|"以提高可读性,但您可能希望使用更奇特的字符。

// this part could be made a little smarter and more flexible.    
// So, just the basic idea:
Text = Text.Replace(". ", ". |").Replace("? ", "? |").Replace("! ", "! |");

if (Text.Contains("|")) 
    return Text.Split('|', StringSplitOptions.RemoveEmptyEntries);

而我对else return new string[0];感到疑惑,这看起来很奇怪。假设当没有分隔符时,您希望返回输入字符串,则应删除if / else结构。


2

正则表达式方式:

return Regex.Split(Text, @"(?<=[.?!])\s+");

所以,你只需要通过空格分割字符串,在其前面加上.?!中的一个即可。
(?<=[.?!])\s+

正则表达式可视化

演示


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接