Очень простой вопрос о регулярных выражениях - PullRequest
9 голосов
/ 08 июня 2010

У меня очень простой вопрос о регулярных выражениях. Предположим, у меня есть 2 условия:

  1. url = http://www.abc.com/cde/def
  2. url = https://www.abc.com/sadfl/dsaf

Как мне извлечь baseUrl с помощью регулярных выражений?

Пример вывода:

  1. http://www.abc.com
  2. https://www.abc.com

Ответы [ 7 ]

8 голосов
/ 08 июня 2010

Вот так:

String baseUrl;
Pattern p = Pattern.compile("^(([a-zA-Z]+://)?[a-zA-Z0-9.-]+\\.[a-zA-Z]+(:\d+)?/");
Matcher m = p.matcher(str); 
if (m.matches())
    baseUrl = m.group(1);

Однако вместо этого вы должны использовать URI класс , например:

URI uri = new URI(str);
2 голосов
/ 08 июня 2010

Один вкладыш без регулярного выражения:

String baseUrl = url.substring(0, url.indexOf('/', url.indexOf("//")+2));
1 голос
/ 08 июня 2010

За исключением сценариев записи и выброса, вы должны всегда воздерживаться от анализа сложных синтаксисов (адресов электронной почты, URL-адресов, HTML-страниц и т. Д.) С использованием регулярных выражений.* Поверьте мне, вы будете в конечном итоге укушены.

1 голос
/ 08 июня 2010

/^(https?\:\/\/[^\/]+).*/$1/

Это захватит все, что начинается с http, а $ 1 будет содержать все от начала до первого / после //

0 голосов
/ 08 июня 2010

Вот регулярное выражение, которое должно решить проблему, как указано.

https?://[^/]*

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

String urlStr = "https://www.abc.com/stuff";
URL url = new URL(urlStr);
String host = url.getHost();
String protocol = url.getProtocol();
URL baseUrl = new URL (protocol, host);

Это лучше, так как это должно отлавливать больше случаев, если вашвходной URL не такой строгий, как описано выше.

0 голосов
/ 08 июня 2010

Похоже, что простейшим решением для ваших двух конкретных примеров будет шаблон:

[^/]_//[^/]+

, то есть: без слеша (0 или более раз), два слеша, без слеша (0 или более раз)).Вы можете быть строже, чем это, если хотите, так как два существующих ответа действуют по-разному - один будет отклонять, например, URL-адреса, начинающиеся с ftp:, другой отклоняет домены с подчеркиванием (но принимает URL-адреса без начального protocol://тем самым будучи еще шире моего в этом отношении).Это разнообразие ответов (все правильные по отношению к вашим скудным спецификациям ;-) должны подсказывать вам, что ваши спецификации слишком расплывчаты и должны быть ужесточены.

0 голосов
/ 08 июня 2010

Я почти уверен, что есть класс Java, который позволяет манипулировать путями, но если это должно быть регулярное выражение,

https?://[^/]+

будет работать. (s? включено также для обработки https:)

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