SAP ABAP FIND 사용법 String 패턴 검색 예제 모음

오늘은 SAP ABAP FIND 사용 및 String 패턴 검색 예제를 정리해 보도록 하겠습니다.

ABAP에서 FIND 키워드는 문자열 내에서 특정 문자의 패턴이 있는지 찾는데 사용됩니다.

일반 스트링외에도, 텍스트 형태의 인터널 테이블 내에서도 문자열 패턴을 찾을 수 있습니다.

기본 사용법

FIND "찾고자 하는 텍스트" IN "찾을 대상 텍스트" MATCH OFFSET "인덱스가 담길 변수".

아래의 예시는 This is an example string 이라는 문자열에서 example 글자의 위치를 찾는 구문입니다.

DATA: LV_STRING1 TYPE STRING VALUE 'This is an example string for example.',    
LV_SEARCH TYPE STRING VALUE 'example',    
LV_INDEX TYPE I.

FIND LV_SEARCH IN LV_STRING1 MATCH OFFSET LV_INDEX.

IF LV_INDEX >= 1.    
  * LV_INDEX = 11번쨰 선택    
ENDIF.

ABAP의 경우에는 ZERO Index로 위치를 판정하므로, ‘example’ 글자가 시작하는 11번째 시작 위치를 lv_index에 값을 넣어주게 됩니다.

FIRST OCCURRENCE OF

FIRST OCCURRENCE OF는 해당 문자열에서 가장 먼저 나온 즉, 첫번째 패턴만 검색하도록 지정합니다.

DATA: LV_STRING1 TYPE STRING VALUE 'This is an example string for example.',    
LV_SEARCH TYPE STRING VALUE 'example',    
LV_INDEX TYPE I.

FIND FIRST OCCURRENCE OF LV_SEARCH IN LV_STRING1 RESULTS DATA(LV_RESULT).

IF LV_RESULT IS NOT INITIAL.    
  * 11번째    
ENDIF.

RESULTS 에는 변수 타입으로 데이터 생성됩니다.

FIND FIRST OCCURRENCE OF

ALL OCCURRENCES OF

ALL OCCURRENCES OF의 경우, 스트링 내에서 검색어와 매칭되는 모든 패턴을 검색하는 키워드입니다.

DATA: LV_STRING1 TYPE STRING VALUE 'This is an example string for example.',    
LV_SEARCH TYPE STRING VALUE 'example',    
LV_INDEX TYPE I.

FIND ALL OCCURRENCES OF LV_SEARCH IN LV_STRING1 RESULTS DATA(IT_RESULTS).

IF IT_RESULTS[] IS NOT INITIAL.    
  * 11번째, 30번째 선택    
ENDIF.

FIND ALL OCCURRENCES OF

IGNORE CASE

이 키워드를 추가하면 대/소문자를 구분하지 않고 검색하게 됩니다.

아래의 케이스는 앞에 example은 검색되지만, 뒤의 Example은 검색되지 않아 LT_RESULTS에는 하나만 담기게 됩니다.

LV_STRING1 = 'This is an example string for Example.'.

FIND ALL OCCURRENCES OF LV_SEARCH IN LV_STRING1 RESULTS DATA(LT_RESULTS).

IF IT_RESULTS[] IS NOT INITIAL.    
  * 뒤에 Example은 검색하지 못하고 11번재 index 만    
ENDIF.

반면, 아래와 같이 IGNORE CASE 를 추가해 주면 11번째, 30번째 모두 검색 됩니다.

LV_STRING1 = 'This is an example string for Example.'.

FIND ALL OCCURRENCES OF LV_SEARCH IN LV_STRING1 IGNORE CASE RESULTS data(LT_RESULTS).

IF IT_RESULTS[] IS NOT INITIAL.    
  * 뒤에 Example은 검색하지 못하고 11번재 index 만    
ENDIF.

RESULTS

위의 예시 2개에서 볼 수 있듯이, 결과를 인터널 테이블 형태로 저장합니다. 보는바와 같이, 결과 저장에는 주로 RESULTS 구문이 많이 사용됩니다.

만약 텍스트를 찾았다면 FIRST OCCURRENCE OF의 경우에는 하나의 Row가, ALL OCCURRENCES OF의 경우에는 찾은 갯수 만큼의 인덱스가 테이블 형태로 저장이 됩니다.

MATCH OFFSET

첫번째 예제에서 사용되었던 MATCH OFFSET은 마지막으로 발견된 MATCH 위치를 저장합니다. 따라서 ALL OCCURRENCES OF 와 조합하면 가장 마지막 검색된 INDEX를 찾아올 수 있습니다.

FIND FIRST OCCURRENCE OF LV_SEARCH IN LV_STRING1 MATCH OFFSET LV_INDEX.

IF LV_INDEX IS NOT INITIAL.    
  * LV_INDEX에는 11번째 인덱스가 할당됨.    
ENDIF.

REGEX 정규식 검색

REGEX 구문으로 정규식 검색을 할 수 있습니다. 아래의 예시는 ‘This’와 ‘example’의 인덱스 모두를 찾는 예시입니다.

LV_STRING1 = 'This is an example string for example.'.    
LV_SEARCH = 'This|example'.    
FIND ALL OCCURRENCES OF REGEX LV_SEARCH IN LV_STRING1 RESULTS DATA(LT_RESULT2).

IF LT_RESULT2[] IS NOT INITIAL.    
  * 뒤에 Example은 검색하지 못하고 11번재 index 만    
ENDIF.

FIND IN TABLE 인터널 테이블

FIND 명령어는 인터널 테이블 상에 있는 패턴을 검색할 수 있습니다.

IN TABLE /인터널테이블/ 구문을 사용하면 됩니다.

DATA : LT_TAB TYPE TABLE OF STRING.
  DATA : LV_TAB TYPE STRING.

  LV_TAB = 'This is an example string for Example.'.
  APPEND LV_TAB TO LT_TAB.

  LV_TAB = 'This is an example string for example.'.
  APPEND LV_TAB TO LT_TAB.

  LV_TAB = 'This is an example string for example.'.
  APPEND LV_TAB TO LT_TAB.

  FIND ALL OCCURRENCES OF 'example'
  IN TABLE LT_TAB
  IGNORING CASE
  RESULTS DATA(LT_TAB_RESULTS).

example이란 단어는 총 5개가 검색이 되며 LT_TAB_RESULTS 에 결과가 반환되게 됩니다.

ABAP STRING FIND IN INTERNAL Tables

LINE 에는 인터널 테이블의 라인 번호가(희안하게 제로 인덱스가 아닌, 1 인덱스를 사용), OFFSET에는 위치가 들어가게 됩니다.

만약 위의 다른 키워드 예컨대 IGNORE CASE 를 같이 사용하게 된다면, 대문자로 시작하는 “Example” 역시 검색이 되어 총 6개의 LINE과 OFFSET 이 검색되게 됩니다.

FIND ALL OCCURRENCES OF 'example'
  IN TABLE LT_TAB
  IGNORING CASE
  RESULTS DATA(LT_TAB_RESULTS).

ABAP STRING FIND IN INTERNAL Tables IGNORE CASE

SY-SUBRC 판정

FIND를 통해 하나라도 검색이 되었다면 0을, 하나도 검색하지 못했을 때에는 4를 리턴합니다.

따라서 SY-SUBRC 0을 체크한 후 검색된 결과를 탐색하는 것도 괜찮을거 같습니다.

SAP ABAP SY 시스템 변수에 관한 자세한 사항은 아래의 문서를 참고할 수 있습니다.

SAP ABAP SY 시스템 변수 정리, SY-SUBRC 등

예외 처리

FIND_INFINITE_LOOP : 검색어의 길이가 0인 문자열은 무한 루프 예외를 발생
REFI_WRONG_SECTION : SECTION OF의 구문의 길이나 사용법이 잘못된 경우
INVALID_REGEX : REGEX 정규식의 잘못된 사용이 발생했을 때(유효하지 않은 표현식)
REGEX_TOO_COMPLEX: 정규식의 조합이 복잡하여 알 수 없는 오류가 발생한 경우

이상으로 ABAP 스트링 FIND 사용법에 대해서 알아보았습니다.

주요 사항을 요약하면,

  • FISRT OCCURRENCE OF 로 처음 만나는 패턴을 검색할 수 있습니다.
  • ALL OCCURRNECS OF 로 검색어와 일치하는 모든 패턴을 검색할 수 있습니다.
  • RESULTS 구문을 통해 단일 혹은 복수의 결과를 인덱스 테이블 형태로 받을 수 있습니다.
  • IN TABLE /인터널테이블/ 구문을 통해 테이블 내에 패턴을 일괄 검색 할 수 있습니다.
  • 하나라도 검색에 성공했다면 SY-SUBRC 값은 0, 그렇지 않다면 SY-SUBRC 는 4로 반환합니다.

더 자세한 사항은 SAP ABAP FIND의 공식 문서는 FIND Document에서 확인할 수 있습니다.

함께 보면 좋은 글

sap abap 소스 검색 방법 2가지(+텍스트 스캔)

abap break point 디버깅 방법 및 종류(Static, Dynamic)

SAP 유지보수뷰 텍스트 필드 추가(+예제 설명)