【发布时间】:2017-09-01 18:27:19
【问题描述】:
我正在尝试找出如何在 C# 中分析句子的语法。 就我而言,我有一个语法,每个句子都必须遵循。 语法如下所示:
“B”是“C”。
每个句子必须包含五个单词。我的句子的第一个单词必须是'A',第三个'is'和第四个'a'。
现在我想检查一个测试句是否符合我的语法。
测试句:
狗不是猫。
在这个例子中,测试句是错误的,因为第四个单词是“no”而不是“a”,它应该基于语法。
我读到了 LINQ,我可以在其中查询包含指定单词集的句子。
代码如下所示:
//Notice the third sentence would have the correct syntax
string text = "A Dog is no Cat. My Dog is a Cat. A Dog is a Cat.";
//Splitting text into single sentences
string[] sentences = text.Split(new char[] { '.'});
//Defining the search terms
string[] wordToMatch ={"A", "is"};
//Find sentences that contain all terms I'm looking for
var sentenceQuery = from sentence in sentences
let w = sentence.Split(new Char[] {'.'})
where w.Distinct().Intersect(wordsToMatch).Count == wordsToMatch.Count()
select sentence;
使用此代码,我可以检查句子是否包含我要查找的术语,但问题是它没有检查句子中单词的位置。 有没有办法我也可以检查位置,或者更好的方法来检查 C# 句子的语法?
【问题讨论】:
-
"intersect" 没有说明单词在列表中的位置,因此不会起作用。您想要做的是拆分输入字符串并以某种方式编写与模式匹配的方法 - 通过硬编码
if (words[0] != "A") return false;等,或者通过给它一组规则 - 可能是像{ int Index; string RequiredWord; }这样的对象列表.您的第一句话令人震惊,但您的实际要求是相当适度和合理的。更新如果我有更多的感觉,我会直接进入德米特里的正则表达式想法。您的代码也可以构建正则表达式字符串(那么您有 3 个问题) -
“A Dog42 is a Cat17”是一个有效的语法吗?
-
@AleksAndreev 在这种情况下是的。我不是要检查这句话是否有意义。只是想找出句子是否包含我指定的语法
标签: c# string linq string-comparison