C# C的简单正则表达式帮助#

C# C的简单正则表达式帮助#,c#,.net,regex,parsing,binary,C#,.net,Regex,Parsing,Binary,我有一个未完成的二进制文件,其中包含一些我可以使用正则表达式恢复的信息。内容包括: G$12.1.3.5.1957.720p.HDTV.x264-HDLHhttp://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-7

我有一个未完成的二进制文件,其中包含一些我可以使用正则表达式恢复的信息。内容包括:

G$12.1.3.5.1957.720p.HDTV.x264-HDLHhttp://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
虽然我不确定这些是否可以被解析。我注意到它们在
链接
名称
前后都有一个字符。也许这可以缩小问题的范围


顺便说一句,如果答案正确,我愿意悬赏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中出现多次,则必须使用greediness,但随后连续链接(没有额外的文本包含空格)将匹配在一起。如果每个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;
    }
}
//零宽度分割:

string[]linksWithText=Regex.Split(您的字符串,@)(?假设所有URL都以连字符结尾,后跟一些任意数字,后跟反斜杠。这可能有效

`http://[^ ]*-?<id>(\d)+/`
`http://[^]*-?(\d)+/`
你觉得怎么样

更新:尝试以下操作:-

http://(?!http://)[^]*-?(\d)+/

更新代码(??http://)以停止URL匹配的两个URL与一些不是中间空间的URL之间的中间数据连接。


您可以按名称获取捕获的组。整个搜索将是匹配的url,组将与id匹配。

您的匹配将不正确地只匹配http://site.com/forum-24/something-abba-47373/的前半部分,但如果链接从不包含破折号+数字,则它也可以正常工作(换句话说:实际上,我们需要更多关于链接的信息,以确保我们能够提供正确的正则表达式).Yes links info-wise,只能以http://开头,以/结尾。这是肯定的。Abel,*是贪婪的,它将匹配到第一个空格字符,然后回溯到最后一个连字符,后面是一系列数字,后面是反斜杠。它应该匹配整个url。贪婪的*尝试尽可能多地匹配。谢谢Jass,我尝试了第二,但使用以下命令引发了异常:Regex.Matches(内容@“”(http://[^]*-?(\d)+/));关于链接的识别,有几个问题:文本是否包含斜杠?结尾是保证短划线+数字+斜杠还是仅保证斜杠?数字前面是否没有短划线?上面的摘录是否正确,后面的斜杠后面可以有任何非空格字符?文本指的是名称或链接?是的,这是保证的to be-DIGIT/用于链接。总是有数字。我不明白最后一个问题?请澄清一下好吗?我最后的评论是关于URL末尾的-12734/xxx。其中xxx可以是任何东西(如示例中的
&
).不以空格或特殊字符结尾会使匹配更加困难。谢谢,我现在知道了。是的,由于二进制格式,它可能会以&或其他奇怪的字符结尾。但我注意到,如果你看内容,链接和名称前后都有一个额外的字符,那就不用了。对于名称Abba,它们是,N。我喜欢它hat 500赏金,在哪里?;-)谢谢,顺便说一句,你能帮我将链接和ID分组吗?你的返回完整链接正确。我使用了捕获,从0开始,组从1开始(因此是例外)。我的错。我展示了一种替代方法,可以让你更多地控制。关于你的“名字”“:在我的另一种方法中,它是
text
。如果您想要名称,可以使用它,它更容易阅读(没有测试任何内容,希望代码足够正确,您可以继续)啊,对不起,文本在前面。请稍等,我会修正。谢谢Jass!@Joan:为了回答你最近的问题,我需要你的数据样本,特别是出错的部分。我用你在q中给出的样本进行了测试。我对它进行了一点扩展。它对我来说运行良好,忽略
&
,如果它出现在字符串末尾,它将包括到如果文本在中间(不能改变它,除非你知道它匹配什么,即一个特定的字符列表)。