Текущее время: Пн, июл 21 2025, 00:40

Часовой пояс: 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 часа


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

Сейчас этот форум просматривают: нет зарегистрированных пользователей


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

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