Простая справка по Regex для C #

2

У меня есть незавершенный двоичный файл с некоторой информацией, которую я могу восстановить с помощью 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 бонусов за правильный ответ.

  • 1
    По поводу распознавания ссылки, несколько вопросов: Может ли текст содержать косые черты? Конец гарантирует черту + цифры + косую черту или только гарантированную косую черту? Никаких цифр не предшествует тире? Является ли приведенная выше выдержка верной, что после косой черты может быть любой непробельный символ?
  • 0
    Под текстом вы подразумеваете Имена или ССЫЛКИ? Вы правы, гарантированно быть -DIGIT / для ССЫЛКИ. Всегда есть цифры. Я не понял последний вопрос? Можете ли вы уточнить?
Показать ещё 5 комментариев
Теги:
binary
parsing

2 ответа

2
Лучший ответ

Что-то вроде следующего регулярного выражения?

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-адреса.

  • 0
    Спасибо, попробую сейчас.
  • 0
    Спасибо, кстати, вы также можете помочь мне сгруппировать ссылку и идентификатор? Ваши верные полные ССЫЛКИ правильно.
Показать ещё 22 комментария
1

Предполагая, что все URL-адреса заканчиваются дефисом, а затем некоторые произвольные числа, а затем обратная косая черта. Это может сработать.

`http://[^ ]*-?<id>(\d)+/`

Как вы думаете?

UPDATE: Попробуйте следующее: -

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

Обновленный код (?! http://), чтобы остановить URL-адрес, соответствующий двум URL-адресам, объединен с некоторыми данными в середине между URL-адресами, которые не являются пространством.

Вы можете получить захваченную группу по имени. Весь поиск будет совпадать с URL, и группа будет соответствовать идентификатору.

  • 1
    ваше совпадение будет некорректно совпадать только с первой половиной http _ // site.com/forum-24/something-abba-4737373/, но если ссылка никогда не будет содержать тире + цифры, она будет работать так же хорошо (другими словами: на самом деле нам нужно больше информации о ссылках, чтобы быть уверенными, что мы можем дать правильное регулярное выражение).
  • 0
    Спасибо, попробую сейчас.
Показать ещё 6 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню