누구든지 (정규식 일치에 대한 광범위한 경험을 가진) Oracle 12에서 다음 쿼리가 예상치 못한 결과를 반환하는 이유를 설명해 주시겠습니까?
select regexp_substr('My email: [email protected]', '[^@:space:]+@[^@:space:]+')
from dual;
예상 결과 : [email protected]
실제 결과 : t @ t
다른 예시:
select regexp_substr('Beneficiary email: [email protected]', '[^@:space:]+@[^@:space:]+')
from dual;
예상 결과 : [email protected]
실제 결과 : ry1 @ gm
편집 : 두 번 확인했는데 이것은 Oracle SQL과 관련이 없지만 동일한 동작이 모든 정규식 엔진에 적용됩니다. 정규식을 [^ : space :] + @ [^ : space :] +로 단순화하더라도 결과는 동일합니다. @ 기호 앞뒤의 모든 비 공백 문자와 일치하지 않는 이유를 알고 싶습니다. 그리고 왜 때로는 한 문자와 일치하고 다른 시간에는 2 개 또는 3 개 이상의 문자와 일치하지만 전부는 아닙니다.
사용하려는 POSIX 단축키가 올바르지 않습니다. 주위에 대괄호가 필요합니다.
SELECT REGEXP_SUBSTR('Beneficiary email: [email protected]', '[^@[:space:]]+@[^@[:space:]]+')
FROM dual;
또는 더 간단합니다. '@'만 확인하고 이메일 주소가 항상 마지막 공백 뒤의 문자열 끝에 있다고 가정합니다.
WITH tbl(str) AS (
SELECT 'My email: [email protected]' FROM dual UNION ALL
SELECT 'Beneficiary email: [email protected]' FROM dual
)
SELECT REGEXP_REPLACE(str, '.* (.*@.*)', '\1')
from tbl
;
참고 : REGEXP_REPLACE()
일치하는 항목이 없으면 원래 문자열 REGEXP_SUBSTR()
을 반환하고 NULL을 반환합니다. 이를 염두에두고 그에 따라 일치하는 항목이없는 경우 처리하십시오. 항상 예상치 못한 것을 기대하십시오!
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다