Я пытаюсь сопоставить имя хоста с 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!");
}
}
}
}
Это потому, что ваше регулярное выражение ^https?://([^/]+)/?
и ваш вызов метода Matcher#matches
методу, который полностью соответствует вводу.
Вам необходимо использовать:
matcher.find()
В противном случае ваше регулярное выражение будет соответствовать только двум входным строкам: http://stackoverflow.com
и http://stackoverflow.com/
Matcher#group(..)
даже не будет работать без Matcher#find()
. Это вызовет исключения.
Matcher#group(..)
должен произойти после Matcher#matches
Matcher#find
ИЛИ Matcher#find
Взгляните на "http://stackoverflow.com/path"
. Как должен соответствовать ваш шаблон? Он не распознает путь детали.
^https?
соответствует^http
и^https
. Я имею в виду это?
относится только кs
.java.util.regex.Matcher
» (в разделе «Информация о вкусе> Java») и списком онлайн-тестировщиков внизу, где вы можете попробовать сами.