Что-то вроде следующего регулярного выражения?
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-адреса.