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 OFFSET 은 0-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) 지원 여부가 다를 수 있으므로 운영 환경 적용 전 개발 시스템에서 결과를 검증하시기 바랍니다.