如何用大写字母(大写)分隔ABAP字符串?

时间:2019-04-12 14:49:43

标签: abap

我目前必须使用ABAP中的代码,该代码包含一个字符串,该字符串包含多个以大写字母/大写字母开头的单词,并且它们之间没有空格,必须将其分成一个内部表,如下所示:

输入:

NameAgeAddress

输出:

Name

Age

Address

5 个答案:

答案 0 :(得分:5)

这是我能找到的最短的代码,它结合使用regular expressionSPLIT

SPLIT replace( val = 'NameAgeAddress' regex = `(?!^.)\u` with = ` $0` occ = 0 ) 
      AT ` ` 
      INTO TABLE itab.

因此,replace将'NameAgeAddress'转换为'Name Age Address',SPLIT将这3个单词放入内部表中。

详细信息:

  • (?!^.)说要查找的下一个字符(\ u)不应是第一个字符
  • \u是任何大写字母
  • $0本身替换找到的字符串($ 0),并带有空格字符
  • occ = 0替换所有出现的情况

答案 1 :(得分:1)

不幸的是,ABAP中的myAttachments.Add "S:\PDF Quotes\" & Format(Now, "DDMMYY-") & Worksheets("Email").Range("c12") & ".pdf" 语句不允许使用正则表达式作为分隔符表达式。因此,我们必须使用渐进式匹配,这在ABAP中有点尴尬:

.Attachments.Add "S:\PDF Quotes\" & Format(Now, "DDMMYY-") & Worksheets("Email").Range("c12") & ".pdf"

为便于比较,以下语句将在Perl中完成工作:

SPLIT

答案 2 :(得分:1)

使用正则表达式很容易。解决方案可能看起来像这样。

REPORT ZZZ.

DATA: g_string TYPE string VALUE `NameAgeAddress`.

DATA(gcl_regex) = NEW cl_abap_regex( pattern = `[A-Z]{1}[a-z]+` ).

DATA(gcl_matcher) = gcl_regex->create_matcher( text = g_string ).

WHILE gcl_matcher->find_next( ).
  DATA(g_match_result) = gcl_matcher->get_match( ).
  WRITE / g_string+g_match_result-offset(g_match_result-length).
ENDWHILE.

答案 3 :(得分:1)

如果您不想使用或不能使用Regex,请使用以下另一种解决方案:

DATA: lf_input             TYPE string VALUE 'NameAgeAddress',
      lf_offset            TYPE i,
      lf_current_letter    TYPE char1,
      lf_letter_in_capital TYPE char1,
      lf_word              TYPE string,
      lt_word              LIKE TABLE OF lf_word.

DO strlen( lf_input ) TIMES.
  lf_offset = sy-index - 1.
  lf_current_letter = lf_input+lf_offset(1).
  lf_letter_in_capital = to_upper( lf_current_letter ).
  IF lf_current_letter = lf_letter_in_capital.
    APPEND INITIAL LINE TO lt_word ASSIGNING FIELD-SYMBOL(<ls_word>).
  ENDIF.
  IF <ls_word> IS ASSIGNED. "if input string does not start with capital letter
    <ls_word> = <ls_word> && lf_current_letter.
  ENDIF.
ENDDO.

答案 4 :(得分:0)

对于正则表达式过大而普通的ABAP可以做到的情况:

DATA(str) = 'NameAgeAddress'.
IF str CA sy-abcde.
  DATA(off) = 0.
  DO.
    data(tailstart) = off + 1.
    IF str+tailstart CA sy-abcde.
      DATA(len) = sy-fdpos + 1.
      WRITE: / str+off(len).
      add len to off.
    ELSE.
      EXIT.
    ENDIF.
  ENDDO.
  write / str+off.
ENDIF.