在String中查找重复出现的内容

时间:2015-03-22 10:06:44

标签: c# string

我目前正在尝试查找字符串中规则的所有匹配项,并将其复制到矢量中。目的是构建一个从社区网站检索顶级N .mp3文件(播客)的应用程序。

我目前的策略:

    public static string getBetween(string strSource, string strStart, string strEnd)
    {
        int Start, End;
        if (strSource.Contains(strStart) && strSource.Contains(strEnd))
        {
            Start = strSource.IndexOf(strStart, 0) + strStart.Length;
            End = strSource.IndexOf(strEnd, Start);
            string sFound = strSource.Substring(Start, End + 4 - Start);
            strSource = strSource.Remove(Start, End + 4 - Start);
            return sFound;
        }
        else
        {
            return"";
        }
    }

这样称呼:

        for (int i = 0; i < N; i++)
        {
            Podcast.Add(getBetween(searchDoc(@TARGET_HTM), "Sound/", ".mp3"));
        }

searchDoc的位置:

    public static string searchDoc(string strFile)
    {
        StreamReader sr = new StreamReader(strFile);
        String line = sr.ReadToEnd();
        return line;
    }

为什么我发布了如此大量的代码?

这是我在C#中的第一个应用程序。我认为我目前的策略是有缺陷的,我宁愿看到潜在问题的解决方案而不是糟糕代码的廉价修复。随意做你想做的事。

应该做什么:

查找所有出现的"Sound/" + * + ".mp3"(目录Sound中的所有MP3文件,无论其名称如何,都可以从目标.htm文件的顶部找到N。通过返回顶部匹配项并从String中删除它来完成此操作。

它的作用:

它发现第一次出现就好了。它也可以很好地消除这种情况。但是,它只能从strSource执行此操作,并在函数结束时被丢弃。

问题:

如何以安全的方式返回修改后的字符串(没有全局变量或其他不正确的技巧),所以找到的事件被正确删除,然后找到下一个?

2 个答案:

答案 0 :(得分:2)

这是错误的做法。您可以使用Regex.Matches获取所需模式的所有匹配项。正则表达式类似于"Sound/[^/\"]+\.mp3"

获得匹配列表后,您可以将.Cast<Match>().Take(3).Select(m => m.Value)应用于该列表,以便将前3个匹配项作为字符串。

看起来你有一个C ++背景。这可能导致低级设计出于习惯。尽量避免手动字符串解析和循环。

答案 1 :(得分:1)

三个缺陷:

  • 首先,这两件事看起来很强烈,但你将它们分成两个功能。
  • 其次,您忘记使用Substring的startIndex参数,要求您重建以后丢弃的字符串(这是性能损失!)
  • 第三,你遇到了一个小错误:你把strEnd的长度硬编码为4。

我刚刚根据你的代码制作了一个扩展方法,修复了这三个缺陷。未经测试,因为我在这台电脑上没有VS.

public static List<string> Split(this string source, string start, string end) {
    List<string> result = new List<string>();
    int i=0;
    while(source.indexOf(start, i) != -1) {
        startIndex = source.IndexOf(start, i) + start.Length;
        endIndex = source.IndexOf(end, start);
        result.Add(source.Substring(startIndex, endIndex + end.Length - startIndex));
        i = endIndex;
    }
    return result;
}