Я не думаю, что это можно сделать это с помощью простой замены регулярных выражений, но, к счастью, .NET позволяет выполнять гораздо более сложной замены. Во-первых, мы создали регулярное выражение, чтобы захватить первый (например) 25 знаков после начала URL в одной группе, а также любые дополнительные символы в секунду, необязательная группа:
var r = new Regex("(https?://[^ ]{1,25})([^ ]+)?");
Эта вторая группа будет полностью выйдет из строя, если после начала URL-адреса осталось менее 25 символов, но это необязательно, поэтому он не заставит регулярное выражение в целом потерпеть неудачу.
Затем, при замене, мы проверяем соответствие ли вторая группа при принятии решения о том, следует ли добавлять точки:
var s = r.Replace(
Action,
m => string.Concat(
"<a target=\"_blank\" href=\"",
m.Value,
"\">",
m.Groups[1].Value,
(m.Groups[2].Success ? "..." : ""),
"</a>"));
Для входа
"hello http://www.google.com world
http://www.loooooooooooooooooooooooooooooooooooooooooong.com !"
я получаю выходной
hello <a target="_blank" href="http://www.google.com">http://www.google.com</a>
world <a target="_blank"
href="http://www.loooooooooooooooooooooooooooooooooooooooooong.com">
http://www.loooooooooooooooooooo...</a> !
не возможно, по крайней мере, не с эллипсов. Кроме того, вы должны использовать [лучшее выражение для обнаружения ссылок] (http://daringfireball.net/2009/11/liberal_regex_for_matching_urls). (Один из подходов к решению этого вопроса - использование CSS ('a {display: inline-block; width: 20em; overflow: hidden; text-overflow: ellipsis;}') – Tomalak
Итак, ограничения символов предназначены только для показа? (И фактические URL-адреса будут сохранены в полном объеме). Для этого вам не нужно регулярное выражение, просто подстройте полную ссылку и добавьте несколько точек ... – musefan
@musefan Как вы используете подстроку для соответствия * любому URL-адресу? – Rawling