본문 바로가기
ABAP 문법 & 기법

[SAP ABAP] FIND REGEX 시작 위치·매칭 길이 찾기 — MATCH OFFSET + MATCH LENGTH 사용법

by Song.sh 2026. 5. 14.

ABAP에서 문자열 처리를 하다 보면 "이 패턴이 몇 번째 위치에서 시작해서 몇 자리까지 차지하는지" 알아야 할 때가 있습니다. 자재 코드의 특정 prefix 길이 추출, 사번 패턴 검증, 파일명에서 일련번호 위치 잡기 같은 작업들이죠.

 

이때 가장 가볍게 쓰는 명령이 ABAP 표준 FIND REGEX 입니다. 정규식으로 패턴을 찾으면서, 시작 위치(MATCH OFFSET) 와 매칭 길이(MATCH LENGTH) 를 동시에 받아올 수 있다 는 게 핵심. 외부 라이브러리·정규식 클래스 없이 한 줄로 끝납니다.

 

이 글은 FIND REGEX ... MATCH OFFSET ... MATCH LENGTH 의 동작 원리와 활용 패턴을 정리한 메모입니다.


핵심 원리

FIND REGEX 명령은 한 번 호출로 존재 여부 + 시작 위치 + 매칭 길이 세 가지를 동시에 알려줍니다.

결과 받는 변수 의미
존재 여부 SY-SUBRC 0 = 찾음 / 4 = 못 찾음
시작 위치 MATCH OFFSET 매칭이 시작된 0-based 인덱스 (0이 첫 글자)
매칭 길이 MATCH LENGTH 매칭된 부분 문자열의 길이

핵심 포인트는 0-based 인덱스 라는 것. 첫 글자 위치는 0이지 1이 아닙니다. SUBSTRING 같은 후속 명령과 자연스럽게 연결할 수 있도록 설계되어 있습니다.


1단계 — 기본 사용법

명령 한 줄로 모든 정보를 받아옵니다.

DATA: lv_pattern TYPE string.

lv_pattern = 'V20009999'.

FIND REGEX '9999' IN lv_pattern
  MATCH OFFSET DATA(lv_offset)
  MATCH LENGTH DATA(lv_length).

IF sy-subrc = 0.
  WRITE: / 'find'.       " 매칭 성공
ELSE.
  WRITE: / 'not found'.
ENDIF.

핵심 포인트:

  • FIND REGEX — 정규식 모드 (일반 문자열 매칭이면 FIND 만 써도 됨)
  • DATA(lv_offset) · DATA(lv_length) — 인라인 선언 (ABAP 7.40+). 별도 DATA: 블록 불필요
  • SY-SUBRC = 0 으로 매칭 성공 여부 체크

2단계 — 결과 해석

V20009999 안에서 9999 를 찾으면 다음 결과가 나옵니다.

위치(idx) 0 1 2 3 4 5 6 7 8
문자 V 2 0 0 0 9 9 9 9

매칭이 시작된 위치가 인덱스 5 이므로 lv_offset = 5, 매칭된 9999 가 4글자이므로 lv_length = 4 가 됩니다.

변수 값 (예: V20009999 안의 9999)
lv_offset 5 (5번째 인덱스 = 6번째 글자부터 시작)
lv_length 4 (4글자 매칭)

3단계 — 활용 패턴

받아온 offset/length 를 그대로 후속 처리에 활용합니다. 가장 흔한 패턴은 매칭 앞 부분 추출매칭 부분 자체 추출.

" 1) 매칭 시작 전까지의 prefix 추출 — 0 ~ offset 까지
DATA(lv_prefix) = lv_pattern+0(lv_offset).
" 결과: 'V2000'

" 2) 매칭된 부분 자체 추출 — offset ~ offset+length
DATA(lv_match)  = lv_pattern+lv_offset(lv_length).
" 결과: '9999'

" 3) 매칭 이후 suffix 추출 — offset+length 부터 끝까지
DATA(lv_suffix) = lv_pattern+( lv_offset + lv_length )(*).
" 결과: '' (이 예시는 매칭이 문자열 끝이라 비어 있음)

문자열을 패턴 기준으로 세 조각으로 분리 하는 데 그대로 쓸 수 있습니다. SUBSTRING 호출 한 번씩으로 깔끔하게 정리되는 게 장점.


정규식 패턴 응용

FIND REGEX 의 첫 번째 인자는 정규식이므로 단순 리터럴 외에도 다양한 패턴 사용 가능.

정규식 의미
'9999' 리터럴 — 정확히 "9999"
'\d{4}' 숫자 4자리 (예: 2024, 9999, 1234 모두 매칭)
'\d+$' 문자열 끝에 붙은 숫자 (연번 추출 시 유용)
'^[A-Z]\d{4}' 문자열 시작이 영문 1자 + 숫자 4자리 (자재 prefix 검증)
'[0-9]{3}-[0-9]{4}' 3자리-4자리 숫자 패턴 (사번/전화번호 형식)

정규식 안에서 ABAP 특수문자(</code>) 는 그대로 사용 가능. 다만 String literal 안에서는 백슬래시 이스케이프 주의.


흔히 빠뜨리는 함정

0-based 인덱스 혼동

ABAP 화면 상에서는 1번째·2번째 자리로 세지만 MATCH OFFSET0-based. V20009999 의 첫 9는 인덱스 5 (6번째 자리). 사용자에게 자리 수를 보여줄 때는 +1 보정.

SY-SUBRC 미체크

매칭 실패 시(SY-SUBRC = 4) 에도 lv_offset·lv_length 가 의미 없는 값으로 채워질 수 있음. 후속 SUBSTRING 전에 반드시 IF sy-subrc = 0 체크.

FIND vs FIND REGEX

단순 리터럴 매칭만 필요하면 FIND(REGEX 키워드 없이) 가 더 빠름. FIND REGEX 는 정규식 엔진을 거치므로 오버헤드 있음.

첫 매칭만 받음

FIND 는 첫 번째 매칭만 반환. 문자열에 같은 패턴이 여러 번 등장하면 두 번째 매칭은 못 찾음. 모든 매칭이 필요하면 FIND ALL OCCURRENCES OF REGEX + RESULTS 테이블 사용.

대소문자 구분

ABAP 기본은 대소문자 구분. 'v20009999' 안에서 'V' 로 검색하면 매칭 실패. 대소문자 무시하려면 IGNORING CASE 옵션 추가.

특수문자 이스케이프

.·*·+·? 같은 정규식 특수문자를 그냥 매칭하려면 </code> 로 이스케이프. FIND REGEX '.txt' 같은 식.


전체 코드 — 복사용 통합본

위 단계를 하나의 ABAP 프로그램으로 합친 통합본입니다. SE38에 그대로 복사해서 활성화하면 동작합니다. 패턴 문자열·정규식만 실제 환경에 맞게 교체해주세요.

REPORT zexample_find_regex.

DATA: lv_pattern TYPE string.

* 1) 검색 대상 문자열 준비 ------------------------------------------
lv_pattern = 'V20009999'.    " 검색 대상 (예: 자재 코드 형식)

* 2) FIND REGEX — 시작 위치 + 매칭 길이 동시 추출 ---------------------
* ★ 핵심: MATCH OFFSET(0-based) + MATCH LENGTH 두 정보를 한 번에 받음

FIND REGEX '9999' IN lv_pattern
  MATCH OFFSET DATA(lv_offset)
  MATCH LENGTH DATA(lv_length).

* 3) SY-SUBRC 체크 + 결과 활용 --------------------------------------
IF sy-subrc = 0.

  WRITE: / 'find'.
  WRITE: / 'offset:', lv_offset.       " 5
  WRITE: / 'length:', lv_length.       " 4

  " 4) SUBSTRING 으로 세 조각 분리 (offset/length 활용)
  DATA(lv_prefix) = lv_pattern+0(lv_offset).
  DATA(lv_match)  = lv_pattern+lv_offset(lv_length).
  DATA(lv_suffix) = lv_pattern+( lv_offset + lv_length )(*).

  WRITE: / 'prefix:', lv_prefix.       " 'V2000'
  WRITE: / 'match :', lv_match.        " '9999'
  WRITE: / 'suffix:', lv_suffix.       " (이 예시는 비어 있음)

ELSE.
  WRITE: / 'pattern not found'.
ENDIF.

* ※ 활용 예시:
*   - 자재 prefix 추출: FIND REGEX '\d+$' → 끝에 붙은 숫자 위치
*   - 사번 검증:        FIND REGEX '^[A-Z]\d{4}$'
*   - 모든 매칭 필요:   FIND ALL OCCURRENCES OF REGEX ... RESULTS lt_results

요약

단계 처리 핵심
1 패턴 검색 FIND REGEX 'pattern' IN lv_string
2 위치·길이 추출 MATCH OFFSET(0-based) + MATCH LENGTH
3 매칭 확인 IF sy-subrc = 0 분기
4 SUBSTRING 활용 str+0(offset) / str+offset(length) 으로 분리

FIND REGEX ... MATCH OFFSET ... MATCH LENGTH 는 짧은 한 줄로 존재 여부 + 위치 + 길이 를 한 번에 받을 수 있는 가성비 좋은 명령입니다. 자재 코드·사번·파일명 같이 정해진 패턴이 섞인 문자열을 다룰 때 그대로 활용 가능하고, SUBSTRING 까지 연결하면 패턴 기준 문자열 분리도 깔끔하게 처리됩니다. 단, 0-based 인덱스첫 매칭만 받는다 는 두 가지만 머릿속에 박아두면 함정에 빠질 일이 거의 없습니다.


Disclaimer — 이 포스트는 실무 정리 노트를 바탕으로 AI 보조로 정리되었습니다. FIND REGEX 동작은 ABAP 7.40 이상에서 인라인 선언 형태로 사용 가능합니다. SAP 버전에 따라 일부 정규식 문법(예: lookbehind) 지원 여부가 다를 수 있으므로 운영 환경 적용 전 개발 시스템에서 결과를 검증하시기 바랍니다.