Следующее регулярное выражение должно сделать это для вас:
(?<=[/.]|^([^/]|//)*)\s+|\s+(?=[/.])
Замена на ""
(пустая строка) в URL-адресах удаляет все ненужные пробелы. Затем просто замените оставшиеся пробелы на %20
.
Regex объяснение:
Он состоит из двух чередований:
(?<=[/.]|^([^/]|//)*)\s+
\s+(?=[/.])
Второй просто соответствует всем пробелам, следующим за частью пути - всем пробелам до /
или .
.
\s+
все пробелы
(?=[/.])
смотреть вперед, сопоставляя /
или .
.
Первый немного сложнее. Он соответствует всем пробелам (окончание \s+
), которым предшествует совпадение с положительным взглядом за (?<=[/.]|^([^/]|//)*)
.
Этот взгляд позади - (?<=[/.]|^([^/]|//)*)
- состоит из двух чередований, где первая часть - [/.]
- просто соответствует /
или .
.
Вторая часть - ^([^/]|//)*
- соответствует всему URL в начале строки (^
), что не является единственным /
. (Чередование с //
делает двойной слеш при http://
проходе.)
Вкратце это означает, что он соответствует всем пробелам до первой одиночной косой черты в URL. Таким образом, вместе с ранее объясненным чередованием полное регулярное выражение соответствует всем нежелательным пробелам .
Таким образом, оставшиеся пробелы следует просто заменить на %20
:)
Иллюстрация того, как исправить пробелы с помощью C #:
Regex.Replace(sURL, @"(?<=/|^([^/]|//)*)\s+|\s+(?=/)", "").Replace(" ", "%20")
И если я вас правильно понимаю, вы также захотите указать протоколы, если таковые имеются (требование 1). Таким образом, после того, как предыдущая операция была сделана, простое совпадение с ^\w+(?=://)
должно получить вас. (Совпадение всех символов от начала строки до ://
.)
Что касается верхнего домена, подход тот же - извлеките его потом. Но мы используем часть из первого регулярного выражения, чтобы убедиться, что мы получаем только верхний домен, а не расширение файла или что-то подобное. Регулярное выражение (?<=[/.]|^([^/]|//)*)\w+(?=(/|$))
будет соответствовать только символам перед первым синглом /
, используя объяснение, описанное ранее. Но на этот раз вместо пробелов мы сопоставляем символы слова - \w
, вплоть до /
или окончания строки ($
). Это дает нам верхний домен.
Проверьте это на ideone .
Извините за искаженные URL-адреса - это идеальный вариант, и я не знаю, как это "отменить", но вот оригинальный код:
using System;
using System.Text.RegularExpressions;
public class Test
{
public static string CleanURL(string sURL, out string sProtocol, out string sTopDomain)
{
string sCleanURL = Regex.Replace(sURL, @"(?<=[/.]|^([^/]|//)*)\s+|\s+(?=[/.])", "").Replace(" ", "%20");
sProtocol = Regex.Match(sCleanURL, @"^\w+(?=://)").Value;
sTopDomain = Regex.Match(sCleanURL, @"(?<=[/.]|^([^/]|//)*)\w+(?=(/|$))").Value;
return sCleanURL;
}
public static void Main()
{
string[] listURL = {
" somed omain.co m/ my folder/my page. html",
"http://somedomain.info/my folder /",
"https://somedomain.com/my folder/",
"ht tp: //www .somedomain. co m/my folder/ ",
"ht tps: //www .somedomain. in fo/my folder/ ",
" somedomain. com/my folder/ ",
"ht tp: //www .somedomain. co m/my folder/ sub.folder / directory /",
"ht tps: //www .somedomain. in fo/my folder/ ",
" somedomain. com/my folder/ ",
" somedomain. tv "
};
// Write header
Console.WriteLine(string.Format("Protocol Top domain URL\n"));
foreach(string sURL in listURL)
{
string sCleanURL, sProtocol, sTopDomain;
sCleanURL = CleanURL( sURL, out sProtocol, out sTopDomain);
Console.WriteLine(string.Format("{0,-9} {1,-11} {2} ", sProtocol, sTopDomain, sCleanURL));
}
}
}
Выход:
Protocol Top domain URL
com somedomain.com/my%20folder/my%20page.html
http info http://somedomain.info/my%20folder/
https com https://somedomain.com/my%20folder/
http com http://www.somedomain.com/my%20folder/
https info https://www.somedomain.info/my%20folder/
com somedomain.com/my%20folder/
http com http://www.somedomain.com/my%20folder/sub.folder/directory/
https info https://www.somedomain.info/my%20folder/
com somedomain.com/my%20folder/
tv somedomain.tv