Текущее время: Вс, июл 27 2025, 14:00

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


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

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


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

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