Текущее время: Вс, авг 03 2025, 07:00

Часовой пояс: UTC + 3 часа


Правила форума


ВНИМАНИЕ!

Вопросы по SAP Query и Quick View - сюда



Начать новую тему Ответить на тему  [ Сообщений: 22 ]  На страницу Пред.  1, 2
Автор Сообщение
 Заголовок сообщения: Re: Парсим строку
СообщениеДобавлено: Пт, фев 03 2012, 14:07 
Специалист
Специалист
Аватара пользователя

Зарегистрирован:
Пт, июл 16 2010, 09:57
Сообщения: 106
Откуда: СПб
Пол: Мужской
Раз сказано, что в строке может быть как минимум 3 элемента (и соответственно 2 разделителя), то алгоритм схематично может быть примерно таким:

1. Если разделителем может быть абсолютно любой символ, то составляем список уникальных символов строки. Ну, или используем некий постоянный список наиболее характерных символов.
2. Символы по очереди подставляем в регулярное выражение.
Например, если проверяется разделитель '~', то выглядит как-то так:
Code:
DATA tempstr  TYPE string.
DATA sep      TYPE c LENGTH 1.
DATA regexstr TYPE string.

sep = '~'.

CONCATENATE '\A'
            '[^' sep ']+'
            sep
            '[^' sep ']+'
            sep
            '[^' sep ']+'
INTO regexstr.

tempstr = 'Пролетарии~всех~стран~соединяйтесь'.

"FIND REGEX '\A[^~]+~[^~]+~[^~]+' IN tempstr.
FIND REGEX regexstr IN tempstr.

IF sy-subrc = 0.
  WRITE: / 'Найдено!'.
ENDIF.

3. Анализируем результаты подстановок (см. в хелпе по FIND REGEX про дополнение MATCH) и пытаемся "понять" символ-разделитель.


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Парсим строку
СообщениеДобавлено: Пт, фев 03 2012, 14:45 
Старший специалист
Старший специалист
Аватара пользователя

Зарегистрирован:
Пт, окт 08 2010, 11:37
Сообщения: 322
Хорошее решение, но кто сказал что разделитель это 1 элемент, и что это служебный символ.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Парсим строку
СообщениеДобавлено: Пт, фев 03 2012, 14:47 
Старший специалист
Старший специалист
Аватара пользователя

Зарегистрирован:
Пт, окт 08 2010, 11:37
Сообщения: 322
Пономарев Артем написал:
LELUK, задача решается двумя путями:
1. Предусмотреть набор типичных разделителей и оперировать ими
2. Никак

Пытаться идти по пути номер 2 можно. Но сделать что-то "интеллектуальное" и работающее лучше пункта 1 - это из области фантастики.


Начало года, у меня данная задача стоит на 2 недели, как раз чтобы сделать чудо :D
П.С. Если по первому пути пойду сделаю поле для ввода разделителя и усе


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Парсим строку
СообщениеДобавлено: Пт, фев 03 2012, 14:52 
Старший специалист
Старший специалист

Зарегистрирован:
Пн, сен 19 2011, 13:29
Сообщения: 492
Пол: Мужской
LELUK написал(а):
П.С. Если по первому пути пойду сделаю поле для ввода разделителя и усе

А если разделитель служебный символ.. как то "таб", "перевод каретки" и т.п. ?


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Парсим строку
СообщениеДобавлено: Пт, фев 03 2012, 18:03 
Специалист
Специалист
Аватара пользователя

Зарегистрирован:
Пт, июл 16 2010, 09:57
Сообщения: 106
Откуда: СПб
Пол: Мужской
LELUK написал(а):
Хорошее решение, но кто сказал что разделитель это 1 элемент, и что это служебный символ.

Чисто из-за пятницы и ради познавательной забавы реализовал свои пункты алгоритма 1 и 2 в маленьком примерчике. Обращаю внимание - не ограничиваясь одним символом в разделителе! :)
Кстати, регулярное выражение может быть и попроще того, что я приводил выше.
Code:
DATA it_shingles  TYPE SORTED TABLE OF string
                  WITH UNIQUE KEY table_line.
DATA str_len      TYPE i.
DATA shingle_len  TYPE i.
DATA off          TYPE i.
DATA off_shi      TYPE i.
DATA mcnt         TYPE i.
DATA curr_substr  TYPE string.
DATA tempstr      TYPE string.
DATA sep          TYPE string.
DATA regexstr     TYPE string.

tempstr = 'Пролетарии~~всех~~стран~~соединяйтесь'.

TRANSLATE tempstr TO UPPER CASE.
str_len = STRLEN( tempstr ).

"получение списка уникальных подстрок (шинглов)
"в качестве разделителя ищем подстроку
DO 5 TIMES. "пусть не длиннее 5 символов
  shingle_len = sy-index.

  DO str_len TIMES.
    off = sy-index - 1.
    off_shi = off + shingle_len.

    CHECK off_shi <= str_len.
    curr_substr = tempstr+off(shingle_len).
    COLLECT curr_substr INTO it_shingles.
  ENDDO.
ENDDO.

"проверка каждой уникальной подстроки в качестве разделителя
LOOP AT it_shingles INTO sep.
  CLEAR: mcnt.
  CONCATENATE '\A'    "начиная с левого края строки,
              '.+'    "разделитель должен как минимум дважды
              sep     "встретиться в строке
              '.+'    "и соседние с разделителем фрагменты строки
              sep     "должны быть непустые
              '.+'    "(пустые строки не рассматриваем)
         INTO regexstr.

  FIND REGEX regexstr IN tempstr
    MATCH COUNT mcnt.

  CHECK mcnt > 0.
  "в случае успеха выводим очередной потенциальный разделитель
  WRITE: / sep, mcnt.
ENDLOOP.

На выходе получилось (WRITE вывел):
Code:
~          1
~~          1
~~С          1
~С          1
А          1
Е          1
И          1
Н          1
О          1
Р          1
С          1
Т          1

Буквы, конечно, должны пойти лесом. Или покажите мне ОБЫЧНОГО пользователя, который бы в качестве разделителя элементов списка непринужденно использовал бы строку '~~С' :)


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Парсим строку
СообщениеДобавлено: Пт, фев 03 2012, 18:27 
Модератор
Модератор
Аватара пользователя

Зарегистрирован:
Пт, июн 16 2006, 00:43
Сообщения: 1686
Откуда: Москва <-> Красноярск
Пол: Мужской
Gustav, когда я писал свой ответ я имел в виду именно это. В итоге все сводится к набору предварительно заданных часто используемых разделителей. Все остальное "идет лесом". И зачем тогда столько лишнего кода? :)


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Парсим строку
СообщениеДобавлено: Вс, окт 20 2019, 16:48 
Ассистент
Ассистент

Зарегистрирован:
Ср, янв 17 2018, 21:22
Сообщения: 36
Пол: Мужской
Разбиение строки на подстроки с помощью функции substring и его вариаций, может полезно будет. Вот пример: https://youcoder.ru/line_separation.html


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 22 ]  На страницу Пред.  1, 2

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex [Bot]


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

Найти:
Перейти:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB