Простая справка по Regex для C # - PullRequest
2 голосов
/ 27 октября 2009

У меня есть незаконченный двоичный файл, в котором есть некоторая информация, которую я могу восстановить с помощью регулярных выражений. Содержание:

G $ 12.Angry.Men.1957.720p.HDTV.x264-HDLH L http://site.com/forum/f89/12-angry-men-1957-720p-hdtv-x264-hdl-538403/ L I Š M, ABBA.The.Movie.

Как я могу разобрать это, чтобы я мог по крайней мере получить 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. Так может это может сузить проблему?

Кстати, я готов дать 500 наград за правильный ответ.

Ответы [ 2 ]

2 голосов
/ 27 октября 2009

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

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

РЕДАКТИРОВАТЬ: все совпадение является ссылкой, идентификатор в первых скобках захвата, обновленный код, чтобы показать, как получить информацию.

Обновление: если тире + цифры + косая черта могут встречаться в 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-адреса.

1 голос
/ 27 октября 2009

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

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

Что ты думаешь?

ОБНОВЛЕНИЕ: Попробуйте это: -

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...