У меня есть очень простой regex вопрос. Предположим, что у меня есть 2 условия:
Как я могу извлечь baseUrl, использующий regex?
Демонстрационный вывод:
Как здесь:
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
class вместо этого, как здесь:
URI uri = new URI(str);
Один лайнер без регулярного выражения:
String baseUrl = url.substring(0, url.indexOf('/', url.indexOf("//")+2));
/^(https?\:\/\/\/[^\/]+).*/$1/
Это перехватит ЛЮБОЕ, что начинается с http, а $1 будет содержать все от начала до первого / после //
За исключением сценариев записи и удаления, вы должны всегда воздерживаться от синтаксического анализа сложных синтаксисов (адресов электронной почты, URL-адресов, HTML-страниц и т. Д.) С использованием регулярных выражений.
поверьте мне, вы рано или поздно укусите.
Я почти уверен, что существует класс Java, позволяющий манипулировать путями, но если это должно быть регулярное выражение,
https?://[^/]+
подойдет. ( s?
включены также для обработки https:
)
Вот регулярное выражение, которое должно удовлетворять заданной задаче.
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 или более раз), две косые черты, не-косая черта (0 или более раз). Вы можете быть строже, если хотите, так как два существующих ответа делают это по-разному - один отклоняет, например, URL, начинающиеся с ftp:
, другой отклоняет домены с подчеркиванием (но принимает URL без ведущего protocol://
, таким образом, будучи даже шире моего в этом отношении). Такое разнообразие ответов (все правильные по отношению к вашим скудным спецификациям;-) должно навести вас на мысль, что ваши спецификации слишком расплывчаты и должны быть ужесточены.