Парсер строк с тегами - Форум администраторов игровых серверов
Форум администраторов игровых серверов StormWall - Защита от DDos атак
Регистрация Мнения Справка Пользователи Календарь Все разделы прочитаны
Вернуться   Форум администраторов игровых серверов > Полезное / Common > Программирование / Programming > Java

Java В данном форуме вы сможете найти много полезной информации по платформе Java. Подробные статьи, исходные коды и конечно учебники как для новичков так и профессиональных Java разработчиков вы найдёте здесь. Если у вас есть вопрос или хотите поделится своими наработками, пожалуйста, делайте это в этой теме.

Ответ
Опции темы
Непрочитано 14.03.2016, 23:14   #1
Аватар для Aristocrat
Мастер

Автор темы (Топик Стартер) Парсер строк с тегами

Уважаемые форумчане.

Прошу помощи в решении задачи.

Есть массив произвольных строк.

Пример строки 1: <tag><tag>TEXT</tag><tag>TEXT2</tag><tag>TEXT3</tag></tag>

Пример строки 2: <tag><tag>TEXT</tag><tag>TEXT2</tag><tag>TEXT3;<tag>TEXT3.1</tag>;<tag>TEXT3.2</tag></tag></tag>

Нужно нарезать строку на массив из TEXT3 из второго уровня тегов, но при этом не заходя в третий уровень, т.е в TEXT3.X, если все теги одинаковые, а строки могут как иметь третий уровень тегов, так и не иметь его?

Вычленить строку из второго уровня у меня получилось, но как нарезать ее, если split("regexp") не подходит, т.к единого шаблона TEXT3 нет в принципе. Единственный вариант опираться на теги.


Т.е суть проблемы в том, что при нарезке строки на TEXT_X, не получается ограничить ее границы и нарезается еще и содержимое TEXT_X, т.е TEXT_X.1, TEXT_X.2 и т.п

Буду благодарен за советы и помощь.
Aristocrat вне форума Ответить с цитированием
Непрочитано 14.03.2016, 23:29   #2

По умолчанию Re: Парсер строк с тегами

jsoup либа под явку.
__________________
Mangol вне форума Отправить сообщение для Mangol с помощью ICQ Ответить с цитированием
Сказали спасибо:
Непрочитано 14.03.2016, 23:34   #3
Изгнанные

По умолчанию Re: Парсер строк с тегами

легкий пример
Код:
final String url = "http://gazeta.ok-crimea.ru/archive/2014/" + numberArc + "/jilaya-nedvijimost/zemelnye-uchastki/";

            for (int number : number_page)
            {
                System.out.println(" number page: " + number);
                Optional<Document> doc = Optional.empty();
                try
                {
                    doc = Optional.ofNullable(Jsoup.connect(url + number).get());
                }
                catch(IOException e)
                {
                    e.printStackTrace();
                }

                if(doc.isPresent())
                {
                    final Stream<Element> div = doc.get().getElementsByTag("div").stream();

                    div.forEach(d ->
                    {
                        if (d.attr("class", "group_objav") != null)
                        {
                            final Optional<Element> p = Optional.ofNullable(d.getElementsByTag("p").first());

                            if (p.isPresent())
                            {
                                String text = p.get().ownText();

                                if (text.contains("р-н"))
                                {
                                    final String[] value = text.split(" - ");
                                    final String end = value[0] + ", " + value[1];
                                    System.out.println(end);
                                }
                            }
                        }
                    });
                }
            }
GenCloud вне форума Отправить сообщение для GenCloud с помощью Skype™ Ответить с цитированием
Сказали спасибо:
Непрочитано 14.03.2016, 23:41   #4
Аватар для Aristocrat
Мастер

Автор темы (Топик Стартер) Re: Парсер строк с тегами

Цитата:
Сообщение от GenCloud Посмотреть сообщение
легкий пример
Так вот тут и проблема, что все теги одинаковые. Т.е при попытке получить

Код:
final Stream<Element> div = doc.get().getElementsByTag("tag").stream();
оно нарежет нам и содержимое TEXT3...

Мне нужно как-то ограничить нарезку двумя вхождениями.
Aristocrat вне форума Ответить с цитированием
Непрочитано 15.03.2016, 00:04   #5
Изгнанные

По умолчанию Re: Парсер строк с тегами

Цитата:
Сообщение от Aristocrat Посмотреть сообщение
Так вот тут и проблема, что все теги одинаковые. Т.е при попытке получить

Код:
final Stream<Element> div = doc.get().getElementsByTag("tag").stream();
оно нарежет нам и содержимое TEXT3...

Мне нужно как-то ограничить нарезку двумя вхождениями.
Какой-то может есть блок, где можно собственно и зацепиться...
GenCloud вне форума Отправить сообщение для GenCloud с помощью Skype™ Ответить с цитированием
Непрочитано 15.03.2016, 00:13   #6
Аватар для Aristocrat
Мастер

Автор темы (Топик Стартер) Re: Парсер строк с тегами

Вообщем я наверное изобретаю велосипед))

Суть задачи в исходном виде.
Есть строка с эффектом скила в PTS-формате.

Мне нужно как-то выдернуть содержимое эффекта в виде массива строк.
Пример:
ВХОД:
Код:
{{p_physical_defence;{all};-10;per};{i_dispel_by_slot_probability;pd_up;100};{i_dispel_by_slot_probability;improve_pa_pd_up;100};{p_block_buff_slot;{improve_pa_pd_up;pd_up}}}
ВЫХОД:
Код:
{p_physical_defence;{all};-10;per};
{i_dispel_by_slot_probability;pd_up;100};
{i_dispel_by_slot_probability;improve_pa_pd_up;100};
{p_block_buff_slot;{improve_pa_pd_up;pd_up}}
Казалось бы, бери да сплить по "};{", но фигушки.. Есть к примеру строки:
Код:
{{p_ability_change;{{pdefend;50};{pattack;50};{mdefend;25};{mattack;25};{mp;10};{hp;10};{criticalprob;20};{pattackspeed;10};{musespeed;3}}}}
где при таком подходе, он нарежет нам и содержимое самого эффекта..

Также есть строки такого вида:
Код:
{{p_physical_defence;{all};-10;per};{i_dispel_by_slot_probability;pd_up;100};{i_dispel_by_slot_probability;improve_pa_pd_up;100};{p_block_buff_slot;{improve_pa_pd_up;pd_up}}}
Которые исключают использование символов "{" и "}" как тегов... по причине, что снова нарезается содержимое эффекта.
Цитата:
00:43:07.926 ------- {{i_m_attack;65};{p_speed;{all};-20;per}} --------
00:43:07.928 ;
00:43:07.928 i_m_attack;65
00:43:07.929 p_speed;;-20;per
00:43:07.929 all
Может есть какие-то варианты, как можно считать содержимое эффекта целиком?
Aristocrat вне форума Ответить с цитированием
Непрочитано 15.03.2016, 00:51   #7

По умолчанию Re: Парсер строк с тегами

Проверить наличие таких конструкций одной регуляркой, и в зависимости от этого разбирать внутреннюю часть одним либо другим способом.
Либо потратить время и освоить один из нормальных парсеров. Мы используем ANTLR. Именно такие задачи, когда регулярки уже не хватает - он решает на ура.
Camelion вне форума Отправить сообщение для Camelion с помощью ICQ Ответить с цитированием
Сказали спасибо:
Непрочитано 15.03.2016, 00:58   #8
Аватар для Bacek

По умолчанию Re: Парсер строк с тегами

PHP код:
            String str "{{p_physical_defence;{all};-10;per};{i_dispel_by_slot_probability;pd_up;100}}";
            List<
StringeffectsArray splitList(str); 
PHP код:
    private static List<StringsplitList(String s) {
        
String s2 =  s.substring(1s.length() - 1);
        List<
Stringres = new ArrayList<>();
        
StringBuffer buff = new StringBuffer();
        
int level 0;
        for (
char part s2.toCharArray())
        {
            if (
part == '{')
                
level++;
            else if (
part == '}')
                
level--;
            else if (
part == ';' && level == 0)
            {
                
res.add(buff.toString());
                
buff = new StringBuffer();
                continue;
            }
            
buff.append(part);
        }
        
res.add(buff.toString());
        return 
res;
    } 
каждый след уровень юзай splitList заного
__________________
Человек просто обязан ошибаться, раз другие учатся на его ошибках .......
Bacek вне форума Отправить сообщение для Bacek с помощью ICQ Ответить с цитированием
Сказали спасибо:
Непрочитано 15.03.2016, 01:16   #9
Аватар для Aristocrat
Мастер

Автор темы (Топик Стартер) Re: Парсер строк с тегами

Цитата:
Сообщение от Bacek Посмотреть сообщение
-
Огромное спасибо!

Код:
01:14:43.150   ------- {{p_block_act};{i_p_attack;2192;0;0;0};{p_magical_defence;{all};-24;per};{i_target_cancel;40}} --------
01:14:43.153  {p_block_act}
01:14:43.153  {i_p_attack;2192;0;0;0}
01:14:43.154  {p_magical_defence;{all};-24;per}
01:14:43.155  {i_target_cancel;40}
С вашим кодом все отлично разбирается!
Aristocrat вне форума Ответить с цитированием
Ответ


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Парсер NPC PTS -> Java WoWan-SM Инструменты 12 24.09.2014 18:42
Красивый вывод строк в ГС ipx Lineage II 4 19.07.2013 02:13
Парсер DAT->DAT, DAT->SQL MrShyr Курилка / Yak floor 2 01.03.2013 00:21
Парсер xml'ки Shayne PHP 31 10.07.2012 17:58
Мобы и количество строк вещей 3EBC Серверная часть 2 19.03.2010 02:58


© 2007–2020 «Форум администраторов игровых серверов»
Защита сайта от DDoS атак — StormWall
Работает на Булке неизвестной версии с переводом от zCarot
Текущее время: 06:44. Часовой пояс GMT +3.

Вверх