본문 바로가기

[오라클 레퍼런스 함수] REGEXP_INSTR - 정규 표현식(regular expression)을 사용하여 부분 문자열 위치 반환

by ㅇㅍㅍ 2023. 8. 15.
[오라클 레퍼런스 함수] REGEXP_INSTR - 정규 표현식(regular expression)을 사용하여 부분 문자열 위치 반환
728x90

 

 

 

REGEXP_INSTR

 

구문

REGEXP_INSTR ( source_char, pattern
               [, position
                  [, occurrence
                     [, return_opt
                        [, match_param
                           [, subexpr ]
                        ]
                     ]
                  ]
               ]
             )

 

목적

REGEXP_INSTR은 INSTR 함수의 기능을 확장하여 정규 표현식 패턴을 사용하여 문자열을 검색하는 데 사용됩니다. 이 함수는 입력 문자 집합에 정의된 문자를 사용하여 문자열을 평가합니다. 반환 값은 return_option 인수의 값에 따라 일치하는 하위 문자열의 시작 또는 끝 위치를 나타내는 정수입니다. 일치하는 내용을 찾지 못한 경우 함수는 0을 반환합니다.

이 함수는 POSIX 정규 표현식 표준과 Unicode 정규 표현식 지침을 준수합니다. 더 자세한 정보는 Oracle Regular Expression Support을 참조하십시오.

 

  • source_char은 검색 값으로 사용되는 문자 표현식입니다. 일반적으로 문자 열이며 CHAR, VARCHAR2, NCHAR, NVARCHAR2, CLOB 또는 NCLOB 데이터 유형 중 하나 일 수 있습니다.

  • pattern은 정규 표현식입니다. 일반적으로 텍스트 리터럴이며 CHAR, VARCHAR2, NCHAR 또는 NVARCHAR2 데이터 유형 중 하나 일 수 있습니다. 최대 512 바이트까지 포함 할 수 있습니다. pattern의 데이터 유형이 source_char의 데이터 유형과 다른 경우 Oracle 데이터베이스는 patternsource_char의 데이터 유형으로 변환합니다. pattern에서 지정할 수 있는 연산자 목록에 대해서는 Oracle Regular Expression Support을 참조하십시오.

  • position은 Oracle이 검색을 시작해야 할 source_char의 문자를 나타내는 양의 정수입니다. 기본값은 1로, Oracle은 source_char의 첫 번째 문자에서 검색을 시작합니다.

  • occurrencesource_char에서 pattern의 몇 번째 발생을 Oracle이 검색해야 하는지를 나타내는 양의 정수입니다. 기본값은 1로, Oracle은 pattern의 첫 번째 발생을 검색합니다. occurrence가 1보다 큰 경우 데이터베이스는 pattern의 첫 번째 발생 다음 첫 번째 문자에서 두 번째 발생을 검색하고 그 다음으로 계속합니다. 이 동작은 INSTR 함수와 다릅니다. INSTR 함수는 두 번째 발생의 검색을 첫 번째 발생의 두 번째 문자에서 시작합니다.

  • return_option을 지정하여 Oracle이 발생에 관련하여 무엇을 반환할지 지정할 수 있습니다.

    º 0을 지정하면 Oracle은 발생의 첫 번째 문자의 위치를 반환합니다. 이것이 기본값입니다.

    º 1을 지정하면 Oracle은 발생 다음 문자의 위치를 반환합니다.

  • match_param은 함수의 기본 일치 동작을 변경할 수 있는 VARCHAR2 또는 CHAR 데이터 유형의 문자 표현식입니다. 이 매개 변수의 동작은 REGEXP_COUNT 함수와 동일합니다. 자세한 정보는 REGEXP_COUNT를 참조하십시오.

  • 하위 표현식이 포함된 pattern의 경우 subexpr은 0에서 9 사이의 정수로 지정되어 함수의 대상이 되는 pattern의 하위 표현식을 나타냅니다. subexpr은 괄호로 둘러싸인 패턴의 조각입니다. 하위 표현식은 중첩될 수 있습니다. 하위 표현식은 패턴에서 왼쪽 괄호가 나타나는 순서로 번호가 매겨집니다. 예를 들어 다음 표현식을 고려해보십시오:

    0123(((abc)(de)f)ghi)45(678)


    이 식에는 다음과 같은 순서로 다섯 개의 하위 표현식이 있습니다. "abcdefghi" 다음에 "abcdef", "abc", "de" 및 "678"가 있습니다.

    subexpr이 0이면 pattern과 일치하는 전체 하위 문자열의 위치가 반환됩니다. subexpr이 0보다 크면 일치하는 하위 문자열의 조각 중 일치하는 하위 표현식 번호 subexpr에 해당하는 부분의 위치가 반환됩니다. pattern이 적어도 subexpr 하위 표현식을 갖고 있지 않은 경우 함수는 0을 반환합니다. null subexpr 값은 NULL을 반환합니다. subexpr의 기본 값은 0입니다.

 

참고:

 

예제

다음 예제는 문자열을 조사하여 하나 이상의 비공백 문자의 발생을 찾습니다. Oracle은 문자열의 첫 번째 문자에서 검색을 시작하며 하나 이상의 비공백 문자의 여섯 번째 발생의 시작 위치 (기본값)을 반환합니다.

SELECT
  REGEXP_INSTR('500 Oracle Parkway, Redwood Shores, CA',
               '[^ ]+', 1, 6) "REGEXP_INSTR"
  FROM DUAL;

REGEXP_INSTR
------------
          37

 

다음 예제는 문자열을 조사하여 s, r, 또는 p로 시작하는 단어의 발생을 찾습니다. 대소문자에 관계없이 그 후에 6개의 알파벳 문자가 따릅니다. Oracle은 문자열의 세 번째 문자에서 검색을 시작하며 대소문자에 관계없이 s, r 또는 p로 시작하는 7글자 단어의 두 번째 발생 다음 문자의 위치를 문자열에서 반환합니다.

SELECT
  REGEXP_INSTR('500 Oracle Parkway, Redwood Shores, CA',
               '[s|r|p][[:alpha:]]{6}', 3, 2, 1, 'i') "REGEXP_INSTR"
  FROM DUAL;

REGEXP_INSTR
------------
          28

 

다음 예제는 subexpr 인수를 사용하여 pattern 내에서 특정 하위 표현식을 검색하는 방법을 보여줍니다. 첫 번째 문은 첫 번째 하위 표현식인 '123'의 첫 번째 문자의 소스 문자열 위치를 반환합니다.

SELECT REGEXP_INSTR('1234567890', '(123)(4(56)(78))', 1, 1, 0, 'i', 1) 
"REGEXP_INSTR" FROM DUAL;

REGEXP_INSTR
-------------------
1

 

다음 문은 두 번째 하위 표현식인 '45678'의 첫 번째 문자의 소스 문자열 위치를 반환합니다.

SELECT REGEXP_INSTR('1234567890', '(123)(4(56)(78))', 1, 1, 0, 'i', 2) 
"REGEXP_INSTR" FROM DUAL;

REGEXP_INSTR
-------------------
4

 

다음 문은 네 번째 하위 표현식인 '78'의 첫 번째 문자의 소스 문자열 위치를 반환합니다.

SELECT REGEXP_INSTR('1234567890', '(123)(4(56)(78))', 1, 1, 0, 'i', 4) 
"REGEXP_INSTR" FROM DUAL;

REGEXP_INSTR
-------------------
7

 

REGEXP_INSTR pattern matching: 예제

다음 문은 테이블 'regexp_temp'을 생성하고 값들을 삽입하는 문장입니다.

CREATE TABLE regexp_temp(empName varchar2(20), emailID varchar2(20));

INSERT INTO regexp_temp (empName, emailID) VALUES ('John Doe', 'johndoe@example.com');
INSERT INTO regexp_temp (empName, emailID) VALUES ('Jane Doe', 'janedoe');

 

다음 예제에서는 email 열을 조회하고 유효한 이메일 주소를 검색하는 문장입니다.

SELECT emailID, REGEXP_INSTR(emailID, '\w+@\w+(\.\w+)+') "IS_A_VALID_EMAIL" FROM regexp_temp;

EMAILID 	     IS_A_VALID_EMAIL
-------------------- ----------------
johndoe@example.com		    1
example.com			    0

 

다음 예제에서는 email 열을 조회하고 유효한 이메일 주소의 개수를 반환하는 문장입니다.

EMPNAME		Valid Email			FIELD_WITH_VALID_EMAIL
--------	-------------------	----------------------
John Doe	johndoe@example.com	1
Jane Doe

 

Live SQL: Oracle Live SQL에서 관련 예제를 보고 실행하려면 REGEXP_INSTR pattern matching을 참조하십시오.

출처: 오라클 레퍼런스

원문 링크: Oracle REGEXP_INSTR 함수 문서

 

반응형

댓글