почему этот код (извлечение имени хоста из URL с регулярным выражением) завершается неудачно

1

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

почему этот код не работает?

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RegexTest {

    public static void main(String[] args)
    {
        Pattern HostnamePattern = Pattern.compile("^https?://([^/]+)/?", Pattern.CASE_INSENSITIVE);

        String[] inputs = new String[]{

                "http://stackoverflow.com",
                "http://stackoverflow.com/",
                "http://stackoverflow.com/path",
                "http://stackoverflow.com/path/path2",
                "http://stackoverflow.com/path/path2/",
                "http://stackoverflow.com/path/path2/?qs1=1",

                "https://stackoverflow.com/path",
                "https://stackoverflow.com/path/path2",
                "https://stackoverflow.com/path/path2/",
                "https://stackoverflow.com/path/path2/?qs1=1",
        };

        for(String input : inputs)
        {
            Matcher matcher = HostnamePattern.matcher(input);
            if(!matcher.matches() || !"stackoverflow.com".equals(matcher.group(1)))
            {
                throw new Error(input+" fails!");
            }
        }

    }

}
  • 0
    ИМХО ^https? соответствует ^http и ^https . Я имею в виду это ? относится только к s .
  • 0
    @EladYosifon: Добро пожаловать в переполнение стека! Пожалуйста, рассмотрите возможность добавления в закладки наших вопросов и ответов по регулярным выражениям для дальнейшего использования. Вы можете найти эти два ответа интересными: соответствующие URL , соответствующие комбинации хост / порт . Также обязательно ознакомьтесь с разделом «Различия между функциями в java.util.regex.Matcher » (в разделе «Информация о вкусе> Java») и списком онлайн-тестировщиков внизу, где вы можете попробовать сами.
Теги:

2 ответа

3
Лучший ответ

Это потому, что ваше регулярное выражение ^https?://([^/]+)/? и ваш вызов метода Matcher#matches методу, который полностью соответствует вводу.

Вам необходимо использовать:

matcher.find()

В противном случае ваше регулярное выражение будет соответствовать только двум входным строкам: http://stackoverflow.com и http://stackoverflow.com/

  • 1
    Обратите внимание, что Matcher#group(..) даже не будет работать без Matcher#find() . Это вызовет исключения.
  • 0
    Да, это правда, вызов Matcher#group(..) должен произойти после Matcher#matches Matcher#find ИЛИ Matcher#find
Показать ещё 1 комментарий
1

Взгляните на "http://stackoverflow.com/path". Как должен соответствовать ваш шаблон? Он не распознает путь детали.

  • 1
    символ вставки (^) в начале регулярного выражения означает, что он должен пытаться найти совпадение с входом с начала, а не со всего ввода.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню