我想出了一个问题,找到特定字符串(句子)开始的行的索引。可能看起来很容易,但是当谈到多行句时,事情并不那么容易。
为了说明这一点,假设这是一个文本文件:
1. The very first sentence. Second
2. sentence (multi-line).
所以,让我们说第二句被分配给字符串:
string sentence = "Second sentence (multi-line)."
我想要做的是找到句子开头的行的索引。在这种情况下,输出应该等于1.
到目前为止我的代码:
static int GetSentenceLocation(string fileName, string sentence)
{
string[] lines = File.ReadAllLines(@fileName);
string[] words = sentence.TrimStart().Split(' ');
int location = 0;
for (int i = 0; i < lines.Length; i++)
{
if (Regex.IsMatch(lines[i], words[0]))
{
location = i;
}
}
return ++location;
}
但它不能正常工作,因为同一个词可能会在其他句子中重复出现。 关于如何克服这个问题的任何想法? :)
答案 0 :(得分:1)
这个问题可能非常复杂,但对于您的测试用例,这样的事情可能会有效。您只需要将一行字符串变量中的所有行连接起来。然后查找句子的索引,最后查看该索引落在哪一行。 像这样:
static int GetSentenceLocation()
{
string[] lines = new string[2];
lines[0] = "The very first sentence. Second";
lines[1] = "sentence (multi-line).";
string sentence = "Second sentence (multi-line).";
string alltext = string.Join(" ", lines);
int index = alltext.IndexOf(sentence);
int charCount = 0;
for (int i = 0; i < lines.Length; i++)
{
charCount += lines[i].Length;
if (charCount > index)
return i + 1;
}
return -1;
}
当然这段代码可以优化,但我希望你能理解。
答案 1 :(得分:0)
这是不可能的。你如何定义一个“句子”,以便你的代码可以解决它?例如,你在这里看到多少句话:“你认为A.I.是真的,即计算机真的能像人一样思考吗?”有一些时期。虽然人类可以区分句子,但计算机却不能。
编辑:
好吧,似乎我需要一个更好的例子来证明这一点。鉴于以下两个人类可识别的句子:
你应该找一个好的初级保健医生,例如约翰逊博士。
博士 约翰逊是一位非常好的医生。
如果我想弄清楚以“Dr. Johnson”开头的句子是什么行怎么办?人类可以看到以“约翰逊博士”开头的“真实”句子在第2行。但是,计算机可能会说“我看到一段时间后”,例如“后跟一个空格后跟一个大写字母,它与我的搜索文本匹配。所以它就是#1行。
答案 2 :(得分:0)
从我的评论开始,只需将整个文件放入一个字符串中,然后从中删除搜索字符串。现在计算剩余字符串中的换行符数量并完成:
var allLines = String.Join("", File.ReadAllLines(fileName));
var index = allLines.IndexOf("The very first sentence. Second\nsentence (multi-line).");
var tmp = allLines.Substring(0, index);
var result = tmp.Count(x => x == '\n');