在C#中将文本拆分成句子

9
我想将一段文本分成句子。一个句子以(点)或?或!结尾,后面跟着一个或多个空格字符,下一个句子以大写字母开头。
例如:
第一句话。第二句话!
我该怎么做?

18
当他来到房子时,他喊道:“嘿!有人在吗?”,然后打开门走了进去。我可以处理这个问题。 - Fredrik Mörk
我在我的答案中添加了一个正则表达式来考虑这种情况。参考http://www.regexlib.com/REDetails.aspx?regexp_id=2355 - Thea
@Fredrik Mörk,你的例子是一个特别有趣的案例。我会将其作为一个单独的句子处理。 - Lato
4个回答

34

你可以使用匹配空格的正则表达式进行分割,并使用向后引用来查找句子终止符:

string[] sentences = Regex.Split(input, @"(?<=[\.!\?])\s+");

这段代码将在空格字符上进行分割,并保留句子中的终止符。

示例:

string input = "First sentence. Second sentence! Third sentence? Yes.";
string[] sentences = Regex.Split(input, @"(?<=[\.!\?])\s+");

foreach (string sentence in sentences) {
  Console.WriteLine(sentence);
}

输出:

First sentence.
Second sentence!
Third sentence?
Yes.

1
非常感谢!非常感谢!非常感谢!!!!!!非常感谢!非常感谢!非常感谢..非常感谢...真的太感谢了...我非常需要这个,之前一直在苦恼只能使用单个字符的string.split()函数。 - Mudassir Hasan
1
请注意,这种方法无法处理类似于“Hello Mr. & Mrs. Smith”这样的内容。 - Yodacheese
@Yodacheese:是的,这是真的。要想捕捉到句号实际上结束了一个句子,需要进行更加先进的句子意义分析。例如考虑这个句子:“Mr. Smith 是姓氏。” - Guffa
您可以添加省略号:@"(?<=([.!?])|(.{3}))\s+" - Horia Toma
这是一个非常糟糕的解决方案。 - A X
@AX:你为什么这样认为? - Guffa

5
你想支持哪些语言?例如,在泰国语中,单词之间没有空格,句子之间用空格分隔。因此,总的来说,这个任务非常复杂。同时,请考虑Fredrik Mörk的有用评论。
所以,首先需要定义“句子”的一组规则。然后,您可以使用建议的解决方案之一。

1
我想主要支持英文。有很多特殊情况需要考虑,例如我必须考虑缩写(Dr. Jekyll)。 - Lato
这应该是一条注释,因为这里没有答案,只是在问题中询问更新。 - Leandro Bardelli

4
尝试这个(MSDN
char[] separators = new char[] {'!', '.', '?'};
string[] sentences1 = "First sentence. Second sentence!".Split(separators);
//or...
string[] sentences2 = "First sentence. Second sentence!".Split('!', '.', '?');

3

你尝试过使用 String.Split() 吗?在这里可以找到相关文档。


4
是的,我做了,但还不够。文本里有链接。(例如:www.mysite.it) - Lato

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