我有一个未完成的二进制文件,其中包含一些可以使用正则表达式恢复的信息。内容为:
G $12.Angry.Men.1957.720p.HDTV.x264-HDLH Lhttp://site.com/forum/f89/12-angry-men-1957-720p-hdtv-x264-hdl-538403/L I Š M ,ABBA.The.Movie.1977.720p.BluRay.DTS.x264-iONN Phttp://site.com/forum/f89/abba-movie-1977-720p-bluray-dts-x264-ion-428687/&
如何解析它,以便至少可以获得以下链接
:
http://site.com/forum/f89/abba-movie-1977-720p-bluray-dts-x264-ion-428687/
其中 428687
是 id
编号。
所以我会有一个完整链接
和一个id
。
前面的其他名称是链接的名称:
ABBA.The.Movie.1977.720p.BluRay.DTS.x264-iON
虽然我不确定这些是否可以解析。我注意到它们在LINKS
和NAMES
之前和之后都有一个字符。那么也许这可以缩小问题范围?
顺便说一句,我愿意为正确答案提供 500 赏金。
最佳答案
类似于下面的正则表达式?
MatchCollection matches = Regex.Matches(yourString, @"http://\S+?-(\d+)/")
foreach(Match m in matches)
{
string id = m.Captures[0].Value;
string url = m.Value;
}
它将抓取链接(以http://
开头),然后所有内容都不是空格(保证HTTP(URI)链接中不存在空格),并假设它以数字和尾部斜杠结尾(这将正确删除示例中的 &
或其他尾随文本)。
编辑:整个匹配就是链接,ID 位于第一个捕获括号中,更新代码以显示如何获取信息。
更新:如果破折号+数字+斜杠在 URL 中出现多次,则必须使用贪婪,但连续的链接(没有带有空格的附加文本)将被匹配在一起。如果破折号+数字+斜杠每个 URL 仅出现一次,则首选惰性。这是上面代码中当前的解决方案。
替代方法
从更新和额外信息中,我了解到文本中有很多不清楚的地方。另一种方法可能更简单:拆分 http://
上的所有内容并查看结果。这可以防止必须创建复杂的向前/向后正则表达式,并确保正确处理连续链接(即,中间没有文本):
// zero-width split:
string[] linksWithText = Regex.Split(yourString, @"(?<=http:\S+-\d+/)");
foreach (string link in linksWithText)
{
Match m = Regex.Match(link, @"(.*)(http:\S+-(\d+)/)$");
if (m.Success)
{
string text = m.Groups[1].Value;
string url = m.Groups[2].Value;
string id = m.Groups[3].Value;
}
}
更新:更新了替代方法。首先是文本(名称),然后是 url。请注意负向查找表达式在零宽度点上进行分割,将 URL 之前的任何内容提取到 URL 的末尾。
关于c# - C# 的简单正则表达式帮助,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1630922/