Исключение регулярного выражения Java для отсутствия совпадения, когда шаблон найден в строке

Я умираю, пытаясь понять, почему регулярное выражение не соответствует. Буду признателен за любую оказанную помощь. Я просматриваю веб-страницу построчно (это работает нормально), но мне нужно вытащить ссылки для каждой строки. Приложение проверит, есть ли в строке ссылка, но мне нужно вытащить URL. помощь?

Pattern p = Pattern.compile("^.*href=\"([^\"]*)");
Matcher m = p.matcher(result);
String urlStr = m.group();
links.add(urlStr);

Сообщение об ошибке, которое я продолжаю получать, таково:

Exception in thread "main" java.lang.IllegalStateException: No match found
at java.util.regex.Matcher.group(Matcher.java:485)

Несмотря на то, что в «результате» есть ссылка на ссылку (hxxp://www.yahoo.com).

ссылки - это ArrayList для справки. Заранее спасибо!


person johwiltb    schedule 25.03.2014    source источник


Ответы (2)


первый звонок

m.find();

or

m.matches();

и тогда вы сможете использовать m.group(), если сопоставитель преуспеет.

person Sergey Fedorov    schedule 25.03.2014
comment
Маленькое объяснение. Чтобы иметь возможность вызывать m.group, нам сначала нужно вызвать find ИЛИ matches в экземпляре Matcher (m). Еще одна важная вещь заключается в том, что эти методы должны иметь положительные результаты (они должны возвращать истину), поэтому find должна быть в состоянии найти совпадение одиночного совпадения для регулярного выражения, а matches должна быть в состоянии подтвердить, что весь ввод может быть сопоставлен регулярным выражением . В противном случае совпадения не будет, поэтому в group ничего не будет, поэтому его состояние будет недопустимым. - person Pshemo; 25.03.2014
comment
Таким образом, это исправляет ошибку, но по-прежнему не сопоставляет и не извлекает URL-адреса. Я не могу сказать, что не так с сопоставлением URL. Есть предложения? - person johwiltb; 25.03.2014
comment
Попытайтесь сузить проблему и найти минимальную входную строку, в которой что-то идет не так. Таким образом, вы, скорее всего, найдете проблему в коде. Если нет — задайте другой вопрос через [ssce][1] [1]: sscce.org - person Sergey Fedorov; 25.03.2014
comment
Поэтому я не уверен, как быть более конкретным... У меня есть регулярное выражение, оно не совпадает. Что-то не так с моим регулярным выражением или что-то не так с Java. Это моя проблема. - person johwiltb; 25.03.2014

Итак, я понял это. Единственная проблема заключалась в том, что мое регулярное выражение должно было быть

".*href=\"([^\"]*?)\".*"

Который затем сделал код

private String regex = ".*href=\"([^\"]*?)\".*";
private Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(result);
if (m.matches()) {
    String urlStr = m.group(1);
    links.add(urlStr);
}

Так что это была моя проблема с регулярным выражением, мне пришлось использовать '?' чтобы не быть жадным, я думаю!

person johwiltb    schedule 26.03.2014