Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Регулярные выражения???? 
V
    Опции темы
unkis
  Дата 18.9.2006, 14:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 802
Регистрация: 8.9.2004

Репутация: нет
Всего: 1



Ребята помогите разобраться с регулярными вырожениями.

Код

final String input = "<html><body><h1>Linkliste</h1>"
        + "<a href=\"http:\\\\www.Bastie.de\\java\\howto\\index.html\">Make Java - How To</a>"
        + "<A href=\"http:\\\\www.Bastie.de\\java\\mjregular\\index.html\">Make Java - Regular expression</a>"
        + "<a href=\"http:\\\\www.Bastie.de\\java\\mjperformance\\chapter0.html\">Make Java - Performance</a>"
        + "</body></html>";
Pattern p = Pattern.compile ("<a.*>(.*)</a>", Pattern.CASE_INSENSITIVE);
Matcher m = p.matcher (input);
while (m.find()) {
System.out.println (m.group(1));


есть небольшой кусок HTML, я пытаюсь получить тот текст каторый находится между ссылками.

тоесть чтобы выдавало :

Make Java - How To
Make Java - Regular expression
Make Java - Performance

для этого я написал шаблон в котором говорю:
<a - начинаем искать с  "<a"
.*  -  дальше могут быть любые символы
>   - тег "а" обязательно закрывается
(.*) - любые символы, тоесть тот текст каторый мнен нужен
</a> - ну изаканчивается всё это закрытым тегом

После запуска программы получаю только последний текст
Код

Make Java - Performance


Почему так, что я делаю неправильно и как мне это исправить?


Зарания благодарен.


--------------------
www.unkis.com
PM MAIL WWW   Вверх
LSD
Дата 18.9.2006, 17:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Чтобы понять, почему он так работает достаточно сделать так:
Код
while(m.find())
{
  System.out.println(m.group(0));
  System.out.println(m.group(1));
}


В твоем случае надо переделать регулярку на:
Код
Pattern p = Pattern.compile("<a.*?>(.*?)</a>", Pattern.CASE_INSENSITIVE);


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


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
jsa
Дата 18.9.2006, 17:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 704
Регистрация: 19.1.2006
Где: Новосибирск

Репутация: нет
Всего: 20



Цитата(LSD @ 18.9.2006,  17:22)
Чтобы понять, почему он так работает достаточно сделать так:
Код
while(m.find())
{
  System.out.println(m.group(0));
  System.out.println(m.group(1));
}


правильнее так:
Код

int last = 0;
while(m.find(last)) {
  System.out.println(m.group());
  last = m.end();
}

здесь есть очень интересный пример


--------------------
Все мы, на перине с песней, строим небо на земле © Ю. Шевчук
PM MAIL ICQ   Вверх
LSD
Дата 18.9.2006, 17:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Цитата(jsa @  18.9.2006,  18:44 Найти цитируемый пост)
правильнее так:

А разница?


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
jsa
Дата 18.9.2006, 17:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 704
Регистрация: 19.1.2006
Где: Новосибирск

Репутация: нет
Всего: 20



Цитата

Код

while(m.find())    
{    
  System.out.println(m.group(0));    
  System.out.println(m.group(1));    
}


так не работает

PS: JDK 1.5


--------------------
Все мы, на перине с песней, строим небо на земле © Ю. Шевчук
PM MAIL ICQ   Вверх
LSD
Дата 18.9.2006, 17:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



У меня работает, JDK тоже 1.5.
А что за ошибку выдает?


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
jsa
Дата 18.9.2006, 17:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 704
Регистрация: 19.1.2006
Где: Новосибирск

Репутация: нет
Всего: 20



потому что в данном случае при первой итерации, будет найдена только первая группа совпадений, а идет уже обращение ко второй

Добавлено @ 17:55 
ошибок нет, m.group(1) выдаст значение m.group(0)

Добавлено @ 17:57 
Цитата(jsa @ 18.9.2006,  17:51)
Цитата

Код

while(m.find())    
{    
  System.out.println(m.group(0));    
  System.out.println(m.group(1));    
}



как бы while здесь и в прицепе не нужен тогда, 


--------------------
Все мы, на перине с песней, строим небо на земле © Ю. Шевчук
PM MAIL ICQ   Вверх
LSD
Дата 18.9.2006, 17:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Находим первое совпадение, и печатаем из него нулевую группу (это все совпадение) и первую группу. Затем пытаемся найти следующее совпадение и вывести у него группы, и т.д.

Что тут не так?

Добавлено @ 17:59 
Цитата(jsa @  18.9.2006,  18:54 Найти цитируемый пост)
ошибок нет, m.group(1) выдаст значение m.group(0)

Это еще почему?


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
jsa
Дата 18.9.2006, 18:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 704
Регистрация: 19.1.2006
Где: Новосибирск

Репутация: нет
Всего: 20



зачем тогда while
можно
Код

m.find();
System.out.println(m.group(0));     
 System.out.println(m.group(1));  


равнозначно первой итерации цикла, по смыслу ведь так


--------------------
Все мы, на перине с песней, строим небо на земле © Ю. Шевчук
PM MAIL ICQ   Вверх
LSD
Дата 18.9.2006, 18:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Да, но совпадений же может быть несколько. Попробуй такой код:
Код
String input = "<html><body><h1>Linkliste</h1>"
               + "<a href=\"http:\\\\www.Bastie.de\\java\\howto\\index.html\">Make Java - How To</a>"
               + "<A href=\"http:\\\\www.Bastie.de\\java\\mjregular\\index.html\">Make Java - Regular expression</a>"
               + "<a href=\"http:\\\\www.Bastie.de\\java\\mjperformance\\chapter0.html\">Make Java - Performance</a>"
               + "</body></html>";
Pattern p = Pattern.compile("<a.*?>(.*?)</a>", Pattern.CASE_INSENSITIVE);
Matcher m = p.matcher(input);
while(m.find())
{
  System.out.println(m.group(0));
  System.out.println(m.group(1));
}

с while и без, а заодно на строке которая не имеет совпадений.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
unkis
Дата 18.9.2006, 18:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 802
Регистрация: 8.9.2004

Репутация: нет
Всего: 1



огромное спаибо, теперь я понимаю как это работает


--------------------
www.unkis.com
PM MAIL WWW   Вверх
jsa
Дата 18.9.2006, 18:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 704
Регистрация: 19.1.2006
Где: Новосибирск

Репутация: нет
Всего: 20



завтра попрубую, обязательно сообщу о результатах, а что у меня уже ночь   smile , 

ЗЫЖ  smile  а еще работы дофига.... smile 


--------------------
Все мы, на перине с песней, строим небо на земле © Ю. Шевчук
PM MAIL ICQ   Вверх
jsa
Дата 19.9.2006, 06:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 704
Регистрация: 19.1.2006
Где: Новосибирск

Репутация: нет
Всего: 20



LSD, действительно работает
у меня на заработало при
Код

String input = "select * from tab where id = :ID and name = :Name";
String re = "(\:[a-zA-Z]+)";



--------------------
Все мы, на перине с песней, строим небо на земле © Ю. Шевчук
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0553 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.