【问题标题】:Getting full sentences from index of word从单词索引中获取完整句子
【发布时间】:2012-04-17 17:04:03
【问题描述】:

我正在尝试找到一种比下面的代码更优雅的方法来根据其中一个包含单词的索引来获取句子列表。因此,例如,如果我给它一个单词列表,例如用户名,它会找到所有这些单词的索引(这已经完成并且是 GetWordsMatches 方法)然后,使用该单词的索引,我想抓住整个句子。

我有两个问题,一,我不知道如何在单词之前查看上一期,只是结尾一,二,如果最后一个单词匹配,我不知道如何阻止它崩溃文件末尾没有句点。

public static List<string> GetSentencesFromWords(List<string> Words, string FileContents)
    {
        List<string> returnList = new List<string>();
        MatchCollection mColl = GetWordsMatches(Words,FileContents);
        foreach (Match ma in mColl)
        {
            int tmpInd = ma.Index;
            int endInd = FileContents.IndexOf(".", tmpInd);
            string tmp = FileContents.Substring(tmpInd,endInd);
            returnList.Add(tmp);
        }
        return returnList;
    }

有没有更优雅的方法来做到这一点?

【问题讨论】:

  • GetWordsMatches 到底是做什么的?
  • 它给出了匹配列表中单词所在位置的 MatchCollection。

标签: c# regex substring indexof


【解决方案1】:

快点……

  • 你可以使用LastIndexOf(str, index)从某个位置向后搜索,

  • 对于“结束条件”,我猜你应该在“.”搜索中添加一个if(如果到达末尾,它将返回“-1”),

...无论如何,最好拆分文件内容(以. 作为分隔符),这样你就不会遇到最后一个问题,因为它会拿起最后一行.然后搜索单词(在每一行中,IndexOf 和当前的index)。或者我可能会使用 enumerator (w/yield return) 扩展方法来并行执行所有这些 - 并返回 IEnumerable 以便您可以更具“功能性”,向查询中添加其他内容。

希望对你有帮助

【讨论】:

  • 我对收到的文件没有太多控制权。但是,我想如果缺少一个句号,我可以在字符串的末尾打一个句号。我会看看 LastIndexOf 是否会起作用。
  • 你 endInd 只是得到-1,处理它,然后给它不带长度的子字符串(或使用filecontent.Length - tmpind)。另外一个错误Substring 采用“长度”而不是索引(第二个参数)。您可以添加一个.,只需先将 TrimEnd 用于空白、线条(和点) - 但正确修复它会更容易:)。
【解决方案2】:

LINQ 驱动的解决方案怎么样:

    public static List<string> GetSentencesFromWords(List<string> words, string fileContents)
    {
        return fileContents.Split('.')
            .Where(s => words.Any(w => s.IndexOf(w) != -1))
            .Select(s => s.TrimStart(' ') + ".")
            .ToList();
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-13
    • 1970-01-01
    • 1970-01-01
    • 2019-07-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多