오라클 regexp_substr 마지막 - olakeul regexp_substr majimag

swlee710님 답변에 첨언을 하면...

-n을 넣으면 뒤에서 원하는 n번째 것을 가져 오겠네요..

SELECT regexp_substr(txt,'[^ ]+',1,regexp_count(txt,' ')+2-1) A1
     , regexp_substr(txt,'[^ ]+',1,regexp_count(txt,' ')+2-2) A2
     , regexp_substr(txt,'[^ ]+',1,regexp_count(txt,' ')+2-3) A3
     , regexp_substr(txt,'[^ ]+',1,regexp_count(txt,' ')+2-4) A4
FROM (SELECT 'A B C D' TXT FROM DUAL)
;

Oracle DBMS 정규표현식 뒤에서부터 찾기

정규표현식으로 원하는 문자열을 찾고 싶은데, 문자열에서 가장 마지막으로 찾은 값을 가져오고 싶을 때에는 어떻게 하면 좋을까요?

일반적인 프로그램에서는 해당 언어/라이브러리에서 제공하는 기능을 이용해서 가장 마지막으로 찾은 값을 가져올 수 있겠지만, Oracle DBMS에서는 지원하지 않았습니다.

찾으려는 문자열은 다음과 같았습니다.
유형1: '|aaa|bbb|ccc'
유형2: '|aaa||ccc'
유형3: '|aaa|bbb|'
유형4: '|aaa||'
유형5: '||bbb|ccc'

일종의 배열인데, "|"를 구분자로 사용한 것입니다.
각 유형 별로 가장 마지막의 데이터를 찾는 것이 목적이었습니다.
예를 들면..
유형1: ccc
유형2: ccc
유형3: bbb
유형4: aaa
유형5: ccc
이렇게 찾아야 하는 것이죠.

결론부터 말하자면 문자열을 반대로 뒤집어서 문제를 해결했습니다.
(이 간단한 걸 생각하지 못해서 반나절을 고민했네요..)

SELECT REVERSE(REGEXP_SUBSTR(REVERSE('|aaa|bbb|ccc|ddd'), '[^|]+')) FROM DUAL;

참고로 배열의 첫번째 요소를 찾을 때에는 다음과 같이 합니다.

SELECT REGEXP_SUBSTR('|aaa|bbb|ccc|ddd', '[^|]+') FROM DUAL;

쿼리문 테스트는 https://livesql.oracle.com에서 해보실 수 있습니다.

이 블로그의 인기 게시물

특정 프로세스를 강제 종료 하려는데... "실행 중인 작업 인스턴스가 없습니다." 이런 메시지가 나타나면서 종료가 안되는 문제가 있었습니다. 작업 관리자에서 "프로세스 종료", "프로세스 트리 종료" 해봐도 안되고, cmd에서 taskkill 해봐도 안되고... 그런데 이게 부모 프로세스를 종료하면 자동으로 종료가 되네요.. (제 경우에는 Visual Studio가 부모 프로세스였습니다. ㅋ) 참고: DEVPIA http://www.devpia.com/MAEUL/Contents/Detail.aspx?BoardID=50&MAEULNo=20&no=917792&ref=917791

Visual Studio 2010에서 빌드하면서 exe 파일과 함께 pdb 파일이 생겼습니다. 디버그에 사용된다는 것 외에는 잘 모르고 있었는데, 현재 실행 중인 프로그램을 디버그 할 일이 생겨서 사용법을 찾아보았습니다. 복잡한 내용은 잘 모르겠지만, 다음과 같은 방법으로 디버깅을 시작할 수 있었습니다. 빌드하면서 생성된 exe 파일과 pdb 파일을 잘 보관합니다. (두 파일은 짝을 이룹니다.) 디버그할 exe 파일을 실행합니다. exe 파일과 같은 위치에 "1."의 pdb 파일을 복사해둡니다. Visual Studio 2010을 실행하고, 해당 프로그램의 솔루션을 엽니다. "Windows 작업 관리자"를 실행합니다. 현재 실행 중인 exe 파일의 프로세스를 찾습니다. 찾았으면, 우클릭해서 "디버그"를 선택합니다. 디버거를 연결하겠냐는 확인 창에서 "디버거 연결"을 선택합니다. 그러면 연결할 디버거를 선택하는 화면이 나타나는데, "4."에서 솔루션을 열어둔 인스턴스(Visual Studio 2010 프로그램)를 선택합니다.  ※ 만약 exe 파일과 pdb 파일이 서로 다른 빌드 때 생성된 것이라면 디버깅할 수 없습니다. 참고 Visual Studio 로 디버깅하는 방법 Debugging With Minidump

url에서 도메인만 추출하려면 다음의 방법을 이용하시면 편리합니다. var domain = "주소"; var pattern = /^http:\/\/([a-z0-9-_\.]*)[\/\?]/i; domain = domain.match(pattern); domain = domain[1]; domain = domain.replace("www.", ""); // "www."도 필요없는 경우.

All thing of the world!

IT/Oracle DBMS

Oracle REGEXP_SUBSTR 설명 : 오라클 함수

WorldSeeker 2021. 3. 31. 09:11

1. 함수의 목적
  
    Oracle REGEXP_SUBSTR은 문자열에서 정규표현식 패턴을 검색하여, 검색된 문자열을 반환한다.
    REGEXP_INSTR  문자열의 위치를 반환하는데 반해, REGEXP_SUBSTR은 문자열 자체를 반환한다.


2. 샘플을 통한 개념 퀵뷰

문자열을 검사하여 쉼표로 묶인 첫번째 문자열을 찾는다. 선행 및 후행 쉼표를 포함한 부분문자열을 반환한다.

SELECT
REGEXP_SUBSTR('500 Oracle Parkway, Redwood Shores, CA',
',[^,]+,') "REGEXPR_SUBSTR"
FROM DUAL;
REGEXPR_SUBSTR
-----------------
, Redwood Shores,

3. 사용방법 

오라클 regexp_substr 마지막 - olakeul regexp_substr majimag


4. 함수 PARAMETER 설명
 


리턴데이터 타입은 VARCHAR2 또는 CLOB 데이터로 리턴한다.

[source_char]
source_char는 검색할 소스문자열을 입력하는 입력 파라미터이다.
일반적으로 문자열이며 CHAR, VARCHAR2, NCHAR, NVARCHAR2, CLOB 또는 NCLOB 데이터 유형 중 하나가 될 수 있다.


[pattern]
pattern은 정규식이다.
일반적으로 텍스트이며 CHAR, VARCHAR2, NCHAR 또는 NVARCHAR2 데이터 유형 중 하나며, 최대 512 바이트까지 포함 할 수 있다.
pattern의 데이터 유형이 source_char의 데이터 유형과 다른 경우 pattern을 source_char의 데이터 유형으로 변환한다.


[position]
position은 검색을 시작해야 하는 source_char의 위치를 나타내는 양의 정수이다.
기본값은 1로, Oracle이 source_char의 첫 문자에서 검색을 시작함을 의미한다.


[occurrence]
occurrence는 source_char에서 검색해야 하는 패턴의 발생횟수를 나타내는 양의 정수이다.
기본값은 1이며, 1이라면 pattern의 첫 번째 항목을 찾는다.
occurrence가 1보다 크면, pattern의 첫 번째 발생 다음에 나오는 두번째 발생위치를 검색한다.
이 동작은 첫번째 발생의 두번째 문자부터 두번째 발생을 검색하기 시작하는 INSTR 함수와 다르다.


[match_param]
match_param은 함수의 기본 일치 동작을 변경할 수  있다.

match_param에 대해 다음 값 중 하나 이상을 지정할 수 있다.
- 'i'는 대소문자를 구분하지 않는다.
- 'c'는 대소문자를 구분한다.
- 'n'은 마침표 (.)와 일치하는 모든 문자를 줄 바꿈 문자와 일치시킨다. 이 매개변수를 생략하면 마침표는 개행문자로 보지 않는다.
- 'm'은 소스 문자열을 여러 줄로 취급한다. 
 이 매개 변수를 생략하면 소스 문자열을 단일 행으로 취급한다.
- 'x'는 공백 문자를 무시한다.

 여러 개의 모순된 값을 지정하면 Oracle은 마지막값을 사용합니다. 예를 들어, 'ic'를 지정하면, 'c'를 적용하여 대소문자를 구분한다. 위에 표시된 문자 이외의 문자를 지정하면 오라클은 오류를 반환한다.

match_param에 아무 것도 적지 않게 되면,
- 대소문자 구분은 NLS_SORT 매개 변수의 값에 의해 결정된다.
- 마침표 (.)가 개행문자로 보지 않는다.
- 소스문자열은 단일행으로 처리된다.


[subexpr]
서브 표현식이 있는 패턴의 경우 subexpr은 패턴의 하위표현식이 함수의 검색대상인지 나타내며, 0에서 9까지의 정수로 표현한다.
subexpr은 괄호로 묶인 패턴 조각이며, 하위 표현식은 중첩될 수 있다.
하위 표현식은 왼쪽 괄호가 나타나는 순서대로 번호가 매겨진다.
예를 들어, 다음 표현식을 보자.

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

이 표현식에는 "abcdefghi"다음에 "abcdef", "abc", "de"및 "678"순으로 5 개의 서브 표현식이 있다.
subexpr이 0이면 패턴과 일치하는 전체 하위문자열의 위치를 반환한다.
subexpr이 0보다 큰 경우 일치하는 하위문자열의 하위표현식 번호에 해당하는 하위 문자열의 위치가 반환된다.
pattern에 subexpr 하위 표현식이 없으면 함수는 0을 반환한다.
null subexpr 값은 NULL을 반환한다. subexpr의 기본값은 0이다.


5. 다양한 샘플표현

example1) "http://" 다음에 하나 이상의 영숫자와 마침표 (.) 문자열을 검사한다. "http://"와 슬래시 (/) 또는 문자열의 끝 사이에서 최소 3 번에서 최대 4 회까지 찾는다.

SELECT
REGEXP_SUBSTR('http://www.example.com/products',
'http://([[:alnum:]]+\.?){3,4}/?') "REGEXP_SUBSTR"
FROM DUAL;

REGEXP_SUBSTR
----------------------
http://www.example.com/

example2) subexpr 인수를 사용하여 패턴의 특정 서브표현식을 리턴한다. pattern의 첫번째 서브표현식을 리턴한다.


이 블로그의 광고수익은 고아/조손가정/한부모가정의 어린 꿈나무들의 교육후원에 사용합니다.

여러분의 광고 클릭 하나가 어려운 환경에 놓여 배움의 기회조차 박탈당한 아이들을 돕는데 큰 힘이 됩니다.

따뜻한 마음으로 광고 한 번씩 클릭 부탁드립니다.