Форум администраторов игровых серверов

Форум администраторов игровых серверов (https://forum.zone-game.info/TT.php)
-   Java (https://forum.zone-game.info/forumdisplay.php?f=126)
-   -   Парсер строк с тегами (https://forum.zone-game.info/showthread.php?t=40308)

Aristocrat 14.03.2016 23:14

Парсер строк с тегами
 
Уважаемые форумчане.

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

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

Пример строки 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 и т.п

Буду благодарен за советы и помощь.

Mangol 14.03.2016 23:29

Re: Парсер строк с тегами
 
jsoup либа под явку.

GenCloud 14.03.2016 23:34

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);
                                }
                            }
                        }
                    });
                }
            }


Aristocrat 14.03.2016 23:41

Re: Парсер строк с тегами
 
Цитата:

Сообщение от GenCloud (Сообщение 408492)
легкий пример

Так вот тут и проблема, что все теги одинаковые. Т.е при попытке получить

Код:

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

Мне нужно как-то ограничить нарезку двумя вхождениями.

GenCloud 15.03.2016 00:04

Re: Парсер строк с тегами
 
Цитата:

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

Код:

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

Мне нужно как-то ограничить нарезку двумя вхождениями.

Какой-то может есть блок, где можно собственно и зацепиться...

Aristocrat 15.03.2016 00:13

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
Может есть какие-то варианты, как можно считать содержимое эффекта целиком?

Camelion 15.03.2016 00:51

Re: Парсер строк с тегами
 
Проверить наличие таких конструкций одной регуляркой, и в зависимости от этого разбирать внутреннюю часть одним либо другим способом.
Либо потратить время и освоить один из нормальных парсеров. Мы используем ANTLR. Именно такие задачи, когда регулярки уже не хватает - он решает на ура.

Bacek 15.03.2016 00:58

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 заного

Aristocrat 15.03.2016 01:16

Re: Парсер строк с тегами
 
Цитата:

Сообщение от Bacek (Сообщение 408497)
-

Огромное спасибо!

Код:

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}

С вашим кодом все отлично разбирается!


Текущее время: 13:52. Часовой пояс GMT +3.

Powered by vBulletin® Version 3.8.6
Copyright ©2000 - 2022, Jelsoft Enterprises Ltd. Перевод: zCarot