Рейтинг темы:
  • 0 Голос(ов) - 0 в среднем
  • 1
  • 2
  • 3
  • 4
  • 5
Парсер строк с тегами
#1
Уважаемые форумчане.

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

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

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

Буду благодарен за советы и помощь.
Ответ
#2
jsoup либа под явку.
Smile
Ответ
#3
легкий пример
Код:
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);
                                }
                            }
                        }
                    });
                }
            }
Ответ
#4
GenCloud Написал:легкий пример

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

Код:
final Stream<Element> div = doc.get().getElementsByTag("tag").stream();

оно нарежет нам и содержимое TEXT3...

Мне нужно как-то ограничить нарезку двумя вхождениями.
Ответ
#5
Aristocrat Написал:Так вот тут и проблема, что все теги одинаковые. Т.е при попытке получить

Код:
final Stream<Element> div = doc.get().getElementsByTag("tag").stream();

оно нарежет нам и содержимое TEXT3...

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

Какой-то может есть блок, где можно собственно и зацепиться...
Ответ
#6
Вообщем я наверное изобретаю велосипед))

Суть задачи в исходном виде.
Есть строка с эффектом скила в 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

Может есть какие-то варианты, как можно считать содержимое эффекта целиком?
Ответ
#7
Проверить наличие таких конструкций одной регуляркой, и в зависимости от этого разбирать внутреннюю часть одним либо другим способом.
Либо потратить время и освоить один из нормальных парсеров. Мы используем ANTLR. Именно такие задачи, когда регулярки уже не хватает - он решает на ура.
Ответ
#8
PHP код:
<?php 
String str
= "{{p_physical_defence;{all};-10;per};{i_dispel_by_slot_probability;pd_up;100}}";
List<
String> effectsArray = splitList(str);

PHP код:
<?php 
private static List<String> splitList(String s) {
String s2 = s.substring(1, s.length() - 1);
List<
String> res = 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 заного
Человек просто обязан ошибаться, раз другие учатся на его ошибках .......
Ответ
#9
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}

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


Перейти к форуму:


Пользователи, просматривающие эту тему: 1 Гость(ей)