我目前正在尝试查找字符串中规则的所有匹配项,并将其复制到矢量中。目的是构建一个从社区网站检索顶级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
执行此操作,并在函数结束时被丢弃。
问题:
如何以安全的方式返回修改后的字符串(没有全局变量或其他不正确的技巧),所以找到的事件被正确删除,然后找到下一个?
答案 0 :(得分:2)
这是错误的做法。您可以使用Regex.Matches
获取所需模式的所有匹配项。正则表达式类似于"Sound/[^/\"]+\.mp3"
。
获得匹配列表后,您可以将.Cast<Match>().Take(3).Select(m => m.Value)
应用于该列表,以便将前3个匹配项作为字符串。
看起来你有一个C ++背景。这可能导致低级设计出于习惯。尽量避免手动字符串解析和循环。
答案 1 :(得分:1)
三个缺陷:
我刚刚根据你的代码制作了一个扩展方法,修复了这三个缺陷。未经测试,因为我在这台电脑上没有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;
}