programing

Oracle REGEXP_LIKE 및 단어 경계

newstyles 2023. 3. 5. 09:39

Oracle REGEXP_LIKE 및 단어 경계

REGEXP_LIKE와 단어 경계를 일치시키는 데 문제가 있습니다.다음 쿼리는 예상대로 단일 행을 반환합니다.

select 1 from dual
where regexp_like('DOES TEST WORK HERE','TEST');

하지만 단어 경계에서도 일치하고 싶습니다.따라서 "\b" 문자를 추가하면 이 쿼리가 생성됩니다.

select 1 from dual
where regexp_like('DOES TEST WORK HERE','\bTEST\b');

이 명령을 실행하면 0 행이 반환됩니다.좋은 생각 있어요?

네가 하고 싶은 말은

 select 1 from dual 
  where regexp_like ('does test work here', '(^|\s)test(\s|$)');

왜냐하면\b다음 목록에 표시되지 않음: Oracle 정규 표현식의 Perl 영향 확장

\s테스트는 공백으로 시작하고 종료됩니다.단, 이 문자열에서는 불충분합니다.test일치하는 문자열의 맨 앞 또는 끝에 표시될 수도 있습니다.따라서 대체 수단(에 의해 표시됨)을 사용합니다.|)^스트링의 시작과$문자열의 끝을 나타냅니다.

갱신(3년 이상 경과)...공교롭게도 저는 오늘 이 기능이 필요했습니다.그리고 제가 보기에 정규 표현은 더 좋은 것 같습니다.(^|\s|\W)test($|\s|\W)(Oracle에서 누락된 \b 정규 표현 특수 문자).

Oracle에서 전체 단어를 확인할 수 있는 가장 짧은 정규식은 다음과 같습니다.

(^|\W)test($|\W)

regex 데모를 참조하십시오.

세부 사항

  • (^|\W)- 다음 중 하나에 일치하는 캡처 그룹
    • ^- 문자열 시작
    • |- 또는
    • \W(단어가 아닌 문자
  • test- 한마디
  • ($|\W)- 다음 중 하나에 일치하는 캡처 그룹
    • $- 문자열 끝
    • |- 또는
    • \W- 비단어 문자입니다.

주의:\W문자, 숫자 및 기타 모든 문자와 일치합니다._. 중간중간에 표시되는 단어를 일치시키고 싶은 경우_(점수), 다른 패턴이 필요합니다.

(^|[^[:alnum:]])test($|[^[:alnum:]])

[^[:alnum:]]negated bracket 표현은 영숫자를 제외한 모든 문자와 일치하며 일치합니다._,그렇게,_test_이 패턴과 일치합니다.

이 정규식 데모를 참조하십시오.

일반적으로, 저는 르네의 솔루션을 고수합니다. 단, 길이가 0인 매치가 필요한 경우는 예외입니다.즉, 단어 이외의 문자는 처음/끝에 실제로 캡처하지 않습니다.

예를 들어 문자열이test test그리고나서(\b)test(\b)두 번 일치하지만(^|\s|\W)test($|\s|\W)첫 번째 항목에만 일치합니다.적어도 regexp_substr을 사용하려고 하면 반드시 그렇게 됩니다.

SELECT regexp_substr('test test', '(^|\s|\W)test($|\s|\W)', 1, 1, 'i'), regexp_substr('test test', '(^|\s|\W)test($|\s|\W)', 1, 2, 'i') FROM dual;

돌아온다

test |NULL

언급URL : https://stackoverflow.com/questions/7567700/oracle-regexp-like-and-word-boundaries