在文件中查找特定字符串开头的行?

时间:2016-11-22 12:19:04

标签: c# .net string

我想出了一个问题,找到特定字符串(句子)开始的行的索引。可能看起来很容易,但是当谈到多行句时,事情并不那么容易。

为了说明这一点,假设这是一个文本文件:

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;
    }

但它不能正常工作,因为同一个词可能会在其他句子中重复出现。 关于如何克服这个问题的任何想法? :)

3 个答案:

答案 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');