C# 查找句子的更简单方法是使用大字符串?

C# 查找句子的更简单方法是使用大字符串?,c#,parsing,C#,Parsing,我需要做的是将一个巨大的文本字符串解析成句子。通过寻找终结者来隔离句子。终止符包括“.”和“?”和“:”以及省略号(“…”) 我能说什么吗 if (char is terminator) { // do this } 以干净的方式而不是 if (char == '.' || char == '?' || char == etc etc etc etc ) 我确实想过做一系列的终结者 if (ArrayofTerminators.Contains<char>('th

我需要做的是将一个巨大的文本字符串解析成句子。通过寻找终结者来隔离句子。终止符包括“.”和“?”和“:”以及省略号(“…”)

我能说什么吗

if (char is terminator) 
{ 
    // do this 
}
以干净的方式而不是

if (char == '.' || char == '?' || char == etc etc etc etc ) 
我确实想过做一系列的终结者

if (ArrayofTerminators.Contains<char>('thechar'))
{
    // do that 
} 
if(ArrayofTerminators.Contains('thechar'))
{
//那样做
} 
但这似乎也很愚蠢


*编辑谢谢。有这么多好的回复,很难选择。不管怎样,我选择了UnhandledException的答案,因为它紧凑、优雅,正是我真正想要的

如果切片为分隔符字符串对您有效-
String.Split
支持分隔符数组()

var sentenses=“A?bcd.Foo!”.Split(新字符[]{'.','?','!'})

如果省略号由单独的点表示,则拆分将不起作用


如果需要检查分隔符,只需要找到句子边界,如果使用“分隔符数组”中的许多字符,请考虑使用分隔符“代码”> HASSETA/<代码>(而不是数组)。

< P>假设您只担心8位(或更少)字符集,您可以很容易地只做一个布尔值数组。将终结者设置为true,其他所有设置为false。然后,对终止符的测试变成:

if (terminators[char])
{
   // do this
}

您可以对较大的字符集执行相同的操作,但对于较大的字符(例如,超过16位),它开始使用更多的内存。

String.Split如果只需要对字符进行拆分,则非常有用。如果您需要更深一点的东西,可以考虑使用正则表达式从/< p>
char[] delimiters = new char[] { '.', '?' };
string[] sentences= text.Split(delimiters, StringSplitOptions.RemoveEmptyEntries);

这样你就可以抓住一些关键的例子,比如:
我等不及让简来了。
简不是句子的结尾。

所有的拆分都缺少提示。它们不起作用

一个选项是让句子重复字符

这段代码说明了为什么迭代有效而拆分无效:

        string text = "sentence one. sentence two? sentence three...";
        List<string> sentences = new List<string>();

        StringBuilder sb = new StringBuilder();
        bool termHit = false;

        foreach (char c in text)
        {
            sb.Append(c);

            if (c == '.' || c == '?')
            {
                termHit = true;     
            }
            else
            {
                if (termHit)
                {
                    termHit = false;
                    sentences.Add(sb.ToString());
                    sb = new StringBuilder();
                }
            }
        }

        if (sb.Length > 0)
        {
            sentences.Add(sb.ToString());   
        }

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

        string[] splits = text.Split(new char[] {'.', '?'});

        Console.WriteLine("Split:");
        foreach (string sentence in splits)
        {
            Console.WriteLine(sentence);    
        }
string text=“第一句。第二句?第三句…”;
列表句子=新列表();
StringBuilder sb=新的StringBuilder();
bool-termHit=false;
foreach(文本中的字符c)
{
sb.附加(c);
如果(c='.| | c='?'))
{
termHit=true;
}
其他的
{
如果(termHit)
{
termHit=false;
加上(某人的句子);
sb=新的StringBuilder();
}
}
}
如果(某人长度>0)
{
加上(某人的句子);
}
Console.WriteLine(“解析:”);
foreach(句子中的字符串句子)
{
控制台。书写线(句子);
}
string[]splits=text.Split(新字符[]{'.','?'});
控制台写入线(“拆分:”);
foreach(拆分的字符串句子)
{
控制台。书写线(句子);
}
它输出:

解析:

第一句

第二句

第三句

拆分:

第一句

第二句

第三句


另外,正如洛曼在你问题下的评论中指出的那样。解析句子的问题比所有这些解决方案都要复杂得多。例如,标点符号包含点

很好,我想提出一些不必要的复杂建议,包括用一个特定的终止符替换不同的分隔符,然后运行split,不知道它会接受数组。值得一提的是句号“.”也经常用在缩写中,因此它可能会与结果发生偏差。您可能是对的。如果split失败,我会回来调查你的解决方案谢谢你解决了这个问题,你可以在一个词后面找两个空格(空格计数器)来定义一个句子……现在在一个句子的末尾用两个空格似乎越来越少了。是的,那么定义一个句子就变得越来越难了。你几乎必须理解语法…Split不会返回句子-它会丢失标点符号。