У меня есть незавершенный двоичный файл с некоторой информацией, которую я могу восстановить с помощью regex. Содержимое:
G $12.Angry.Men.1957.720p.HDTV.x264-HDLH Lhttp://site.com/forum/f89/12-angry-men-1957-720p-hdtv-x264-hdl-538403/LI Š M, ABBA.The.Movie.1977.720p.BluRay.DTS.x264-iONN Phttp://site.com/forum/f89/abba-movie-1977-720p-bluray-dts-x264-ion-428687/&
Как я могу разобрать его, чтобы по крайней мере получить links
, которые:
http://site.com/forum/f89/abba-movie-1977-720p-bluray-dts-x264-ion-428687/
где 428687
- номер id
.
Итак, у меня были бы full link
и id
.
Другие имена, которые предшествуют, - это имя ссылок:
ABBA.The.Movie.1977.720p.BluRay.DTS.x264-iON
Хотя я не уверен, что они могут быть проанализированы. Я заметил, что все они имеют характер до и после links
и NAMES
. Может быть, это может сузить проблему?
Btw Я готов дать 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)) и предполагает, что он заканчивается цифрами и завершающей косой чертой (это правильно удалит &
в вашем примере или другом концевом тексте).
EDIT: все совпадение - это ссылка, идентификатор находится в первых скобках, обновленный код, чтобы показать, как получить информацию.
Обновление:, если в URL-адрес могут появляться цифры + цифры + косая черта, более чем один раз в URL-адресе, тогда необходимо использовать жадность, но последующие ссылки (без дополнительного текста с пробелами) будут сопоставлены. Если тире + цифры + слэш происходит только один раз для каждого URL-адреса, то предпочтительнее лень. Это решение в настоящее время в коде выше.
Из обновлений и дополнительной информации я понимаю, что в тексте много неясно. Другой подход может быть проще: разделите все на http://
и просмотрите результаты. Это предотвращает необходимость создания сложного регулярного выражения look-forward/backward и гарантирует, что последовательные ссылки (т.е. Без текста между ними) будут правильно обработаны:
// 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-адреса.
Предполагая, что все URL-адреса заканчиваются дефисом, а затем некоторые произвольные числа, а затем обратная косая черта. Это может сработать.
`http://[^ ]*-?<id>(\d)+/`
Как вы думаете?
UPDATE: Попробуйте следующее: -
http://(?!http://)[^ ]*-?<id>(\d)+/
Обновленный код (?! http://), чтобы остановить URL-адрес, соответствующий двум URL-адресам, объединен с некоторыми данными в середине между URL-адресами, которые не являются пространством.
Вы можете получить захваченную группу по имени. Весь поиск будет совпадать с URL, и группа будет соответствовать идентификатору.