2016-10-06 3 views
4

예상대로 작동 나는 이해할 수 없었다 뭔가 발견하지 않습니다오라클 REGEXP_LIKE 내가 오라클 SQL에서 정규 표현식을 테스트했다

-- NO MATCH 
SELECT 1 FROM DUAL WHERE REGEXP_LIKE ('Professor Frank', '(^|\s)Prof[^\s]*(\s|$)'); 

위가 일치하지 않는 반면, 다음 경기 :

-- MATCH 
SELECT 1 FROM DUAL WHERE REGEXP_LIKE ('Professor Frank', '(^|\s)Prof\S*(\s|$)'); 

다른 정규 표현식에서는 \bProf[^\s]*\b\bProf\S*\b과 비슷한 결과가 표시됩니다. 참고 : Oracle SQL 정규식에는 \b 또는 단어 경계가 없습니다.

질문 : [^\s]*\S*이 Oracle SQL에서 같은 방식으로 작동하지 않는 이유는 무엇입니까?

끝에 (\s|$)을 제거하면 첫 번째 정규식이 일치합니다.

+1

문자 클래스의 \ s를 첫 번째 예제의 공백으로 바꾸면 예상대로 작동합니다. 흥미 롭다면, 나는 스페이스 문자가 \ s에 포함될 것으로 기대했을 것이다! –

+0

문자열에서 백 슬래시를 이스케이프 해 봅니다 (예 : '\\ s' – Barmar

+1

\ s는 공백의 이스케이프 시퀀스이지만 일치하는 문자 집합 (즉, [.....])이 아닙니다. 일치하는 문자 세트에서 두 개의 문자 만 특수한 의미를 갖습니다. - 범위의 경우와] 범위를 닫을 경우. 그들은 도망 갈 수 없다. 매칭 세트에 필요하다면]는 항상 첫 번째 문자 여야하며 - 첫 번째 또는 마지막이어야합니다 (항상 일치하는 세트의 끝에 두는 것이 가장 좋습니다). – mathguy

답변

3

오라클 정규 표현식에서 \s은 실제로 공백의 이스케이프 시퀀스이지만 일치하는 문자 집합 (즉, 한 문자를 제외하는 경우 [.....] 또는 [^....])이 아닙니다. 일치하는 문자 집합에서 두 문자 만 특수한 의미를 갖습니다. 범위는 -이고 집합 열거 형은 ]입니다. 그들은 도망 갈 수 없다. 일치 집합에 필요한 경우 ]은 항상 시작 의 첫 번째 문자 여야합니다 (닫는 문자 ]은 문자로 표시되며 일치하는 집합의 끝을 나타내지 않는 유일한 위치 임). -은 첫 번째 또는 마지막이어야합니다 (항상 일치하는 세트의 끝 부분에 두는 것이 가장 좋습니다). 다른 곳에서는 범위 마커로 간주됩니다. 공백을 포함 시키려면 (또는 [^.....] 구문을 사용하는 경우 제외) 일치하는 집합에 실제 실제 공간을 입력하십시오.

편집 : 위에서 말한 것은 완전히 옳지 않습니다. 일치하는 집합에 또 다른 특수 문자가 있습니다 (예 : ^). 첫 번째 위치에서 사용되면 "다른 모든 문자와 일치"를 의미합니다. 다른 위치에서 그것은 그 자체를 의미합니다. 예를 들어 '[^^]'^ 이외의 모든 단일 문자와 일치합니다 (첫 번째는 ^이 특별한 의미를 가지며 두 번째 문자는 그 자체로 의미가 있음). 그리고 닫는 괄호 ]은 대괄호 안에 두 번째 문자 인 경우 첫 문자가 ^ (특수 의미가있는 경우) 인 경우 자체를 의미합니다. 즉, ] 이외의 문자를 찾으려면 '[^]]'과 일치하는 패턴을 사용할 수 있습니다.

+1

모든 공백 문자 (탭, 줄 바꿈, 세로 탭, 양식 공급, 캐리지 리턴 또는 공백)를 제외하려면 POSIX 문자 클래스를 사용할 수 있습니다. '[^ [: space :]]' – Unoembre

+0

@Unoembre 그렇습니다. 나는 오라클이 다른 대부분의 정규식 구현과 마찬가지로 perl 확장을 허용하지 않고 버그라고 생각한다. : -b Oracle 영역을 입력했습니다 ..... –

+0

@Gary_W - "버그"는 설명서의 내용과 다르게 작동하므로 버그가 될 수 없습니다. 아마도 당신은 오라클의 선택에 동의하지 않을 것입니다. 그것은 다른 것입니다. 또한 오라클은 Perl 확장을 허용합니다 (분명히'\ s'가 일치하는 세트 외부에서 인식되므로!) - https://docs.oracle.com/cd/B19306_01/server.102/b14200/ap_posix003.htm – mathguy