예상대로 작동 나는 이해할 수 없었다 뭔가 발견하지 않습니다오라클 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|$)
을 제거하면 첫 번째 정규식이 일치합니다.
문자 클래스의 \ s를 첫 번째 예제의 공백으로 바꾸면 예상대로 작동합니다. 흥미 롭다면, 나는 스페이스 문자가 \ s에 포함될 것으로 기대했을 것이다! –
문자열에서 백 슬래시를 이스케이프 해 봅니다 (예 : '\\ s' – Barmar
\ s는 공백의 이스케이프 시퀀스이지만 일치하는 문자 집합 (즉, [.....])이 아닙니다. 일치하는 문자 세트에서 두 개의 문자 만 특수한 의미를 갖습니다. - 범위의 경우와] 범위를 닫을 경우. 그들은 도망 갈 수 없다. 매칭 세트에 필요하다면]는 항상 첫 번째 문자 여야하며 - 첫 번째 또는 마지막이어야합니다 (항상 일치하는 세트의 끝에 두는 것이 가장 좋습니다). – mathguy