Текущее время: Вт, июл 29 2025, 09:09

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


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


ВНИМАНИЕ!

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



Начать новую тему Ответить на тему  [ Сообщений: 7 ] 
Автор Сообщение
 Заголовок сообщения: Обработка строки
СообщениеДобавлено: Ср, апр 16 2008, 11:48 
Старший специалист
Старший специалист

Зарегистрирован:
Вт, апр 25 2006, 15:14
Сообщения: 280
Подскажите плиз, как имея строку вида "{some_string1}+{some_string2}/{some_string3}*{some_string4}+..."
(т.е. некие подстроки в фигурных скобках, разделённые арифметическими знаками)
вытянуть из такой строки именно те подстроки по очереди, не важно в скобках или без..


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

Зарегистрирован:
Чт, июн 21 2007, 09:01
Сообщения: 904
Откуда: УЖ 15/2
Пол: Мужской
tdebug написал(а):
Подскажите плиз, как имея строку вида "{some_string1}+{some_string2}/{some_string3}*{some_string4}+..."
(т.е. некие подстроки в фигурных скобках, разделённые арифметическими знаками)
вытянуть из такой строки именно те подстроки по очереди, не важно в скобках или без..

Code:
DATA:
  gv_main TYPE string,
  gt_string TYPE TABLE OF string.

gv_main =
'{some_string1}+{some_string2}/{some_string3}*{some_string4}+..'.

TRANSLATE gv_main USING '-+*+-/+'.
SPLIT gv_main AT '+' INTO TABLE gt_string.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср, апр 16 2008, 12:27 
Старший специалист
Старший специалист

Зарегистрирован:
Вт, апр 25 2006, 15:14
Сообщения: 280
Проблема в том что внутри фигурных скобок, тоже могут встретиться символы, например "-" точно встречается и заменять его там нельзя..

Можно ли как-нибудь использовать FIND? Обозначив например начало подстроки как "{" а конец как "}" вытянуть такие подстроки в таблицу.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср, апр 16 2008, 12:55 
Директор
Директор

Зарегистрирован:
Чт, июн 21 2007, 09:01
Сообщения: 904
Откуда: УЖ 15/2
Пол: Мужской
tdebug написал(а):
Проблема в том что внутри фигурных скобок, тоже могут встретиться символы, например "-" точно встречается и заменять его там нельзя..

Можно ли как-нибудь использовать FIND? Обозначив например начало подстроки как "{" а конец как "}" вытянуть такие подстроки в таблицу.

Да много как можно извратиться, в чём проблема то? В кнопке F1?
Code:
REPLACE ALL OCCURRENCES OF:
  '}+{' IN gv_main WITH '#',
  '}-{' IN gv_main WITH '#',
  '}*{' IN gv_main WITH '#',
  '}/{' IN gv_main WITH '#'.

SPLIT gv_main AT '#' INTO TABLE gt_string.


Code:
SHIFT gv_main LEFT: UP TO '{',
                    BY 1 PLACES.

WHILE gv_main CA '}'.
  gs_string = gv_main+0(sy-fdpos).
  APPEND gs_string TO gt_string.
  SHIFT gv_main LEFT UP TO '{'.
  IF sy-subrc IS NOT INITIAL.
    EXIT.
  ENDIF.
  SHIFT gv_main LEFT BY 1 PLACES.
ENDWHILE.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср, апр 16 2008, 13:00 
Директор
Директор
Аватара пользователя

Зарегистрирован:
Пн, дек 20 2004, 16:05
Сообщения: 1080
Откуда: 4.0B
Пол: Мужской
Можно попробовать такую конструкцию:

DATA: result_tab TYPE match_result_tab.

FIND all OCCURRENCEs of REGEX `\{([^\{\}]+)\}`
IN '{some_string1}+{some_string2}/{some_string3}*{some_string4}'
IGNORING CASE
RESULTS result_tab.

В result_tab будут лежать отступы и длинна нужных Вам выражений.
Если будет время попробую написать конструкцию, которая вернет непосредственно строки.

Нашлось время :)


Code:
  data: regex type ref to cl_abap_regex,
        matcher type ref to cl_abap_matcher.

data: MATCH_RESULT type MATCH_RESULT,
      submatch_result type string,
      match_found type boolean,
      res type string,
      index type i.


  create object regex
    EXPORTING
      pattern     = '\{([^\{\}]+)\}'
      ignore_case = abap_true.

  create object matcher
    EXPORTING
      regex = regex
      text  = '{some string1}+{some_string2}/{some_string3}*{some_string4}'.


do.
   match_found = matcher->FIND_NEXT( ).
if match_found = abap_true.
   MATCH_RESULT = matcher->get_match( ).
   index = 1.
   do.
    try.
     res = matcher->get_submatch( index = index ).
     catch CX_SY_MATCHER.
      exit.
    endtry.
     add 1 to index.
   enddo.
else.
  exit.
endif.
enddo.


Соответсвенно в res должны быть нужные вам строки.

_________________
Я слышу и забываю,
Я вижу и помню долго,
Я делаю и — понимаю.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср, апр 16 2008, 13:15 
Старший специалист
Старший специалист

Зарегистрирован:
Вт, апр 25 2006, 15:14
Сообщения: 280
Читал F1, там непонятно описано как использовать регулярные выражения, в этом и проблема. Например написан пример:

Code:
FIND ALL OCCURRENCES OF regex '^(?:Smile)|(?:Smile)$'
     IN TABLE text_tab RESULTS result_tab.


И это пример для строки состоящей только из слов Smile. Наглядней некуда блин.

В данном случае, написано только что символ "^" обозначает начало строки '^(?:Smile)|(?:Smile)$' , а символ "$" конец строки. И нигде не слова как правильно составлять эту маску для поиска строки, что означают скобки, "?" и ":".


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср, апр 16 2008, 13:16 
Старший специалист
Старший специалист

Зарегистрирован:
Вт, апр 25 2006, 15:14
Сообщения: 280
Lars написал:
Нашлось время :)


Спасибо большое :)


Принять этот ответ
Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 7 ] 

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


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

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


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

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