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不会返回句子-它会丢失标点符号。