2012-02-27 3 views
1

В моем приложении я должен прочитать URL-адрес и сделать что-то, если URL-адрес содержит Базовые учетные данные. Примером такого URL являетсяRegex для HTTP-URL с базовой аутентификацией

http://username:[email protected]

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

^(.+?//)(.+?):(.+?)@(.+)$ 

ответ

3

Это выглядит нормально, и я думаю, что регулярное выражение полезно использовать в этом случае. Несколько предложений:

1) Я думаю, что названные группы сделает ваш код более читаемым, то есть:

^(?<protocol>.+?//)(?<username>.+?):(?<password>.+?)@(?<address>.+)$ 

Тогда вы можете просто написать

Match match = Regex.Match(string, pattern); 
if (match.Success) { 
    string user = match.Groups["username"]; 

2), то вы могли бы сделать выражение немного более строгое, например используя \w, когда это возможно, вместо .:

^(?<protocol>\w+://)... 
+0

Nice! Не знал, что регулярные выражения могут иметь именованные группы. – Mike

+0

Одна проблема с попыткой применить это более широко: базовый auth не требует как имени пользователя, так и пароля. Пример: 'http: // user @ domain.com' –

3

Ваше регулярное выражение кажется хорошо, но почему бы не использовать тщательно проверенные и почти совместимый Uri class? Тогда тривиально получить доступ к интересующим вас частям, не беспокоясь о совместимости со спецификациями:

var url = new Uri("http://username:[email protected]"); 
var userInfo = url.UserInfo.Split(':'); 
var username = userInfo[0]; 
var password = userInfo[1]; 
+0

Жаль, что я мог, но я должен делать то, что Ури не может сделать. Мои пользователи вводят webdav: // вместо http: // для webdav Uris. – Mike

+0

@Mike: Вы уверены, что Ури не справится с этим? Он [отлично работает в Mono] (http://ideone.com/TrClc). – Cameron

+0

Да, я даже не потрудился попробовать, потому что java.net.Uri не смог обработать его для другого продукта, который у нас есть на Java. – Mike

Смежные вопросы