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
'programing' 카테고리의 다른 글
Sinatra 기본 content_type 설정 (0) | 2023.03.05 |
---|---|
permalink(예쁜 URL)에서 게시 ID를 얻는 방법 (0) | 2023.03.05 |
react-router v4에서 쿼리 문자열을 구문 분석하는 방법 (0) | 2023.03.05 |
Wordpress로 코멘트를 마크다운 형식으로 저장하려면 어떻게 해야 합니까? (0) | 2023.03.05 |
폼 입력에 포커스가 있는지 확인 (0) | 2023.03.05 |