어떤 의미에서 나는 내 질문에 대답했지만 대답을 더 잘 이해하려고 노력하고 있습니다.
REGEXP_SUBSTR를 사용하는 경우 (오라클) 수 (중 단일 또는 다중 자리), 어떻게 / 왜 수정합니까의 첫 번째 항목 추출 *
하고 +
영향을 미치는 결과를? +
내가 찾고있는 행동을 제공하고 제공 하지 않는 이유는 무엇 *
입니까? *
대부분의 정규식에서 기본 사용이므로 필요에 맞지 않는다는 사실에 놀랐습니다.
예를 들면 다음과 같습니다.
select test,
regexp_substr(TEST,'\d') Pattern1,
regexp_substr(TEST,'\d*') Pattern2,
regexp_substr(TEST,'\d+') Pattern3
from (
select '123 W' TEST from dual
union
select 'W 123' TEST from dual
);
사용은 regexp_substr(TEST,'\d*')
입력 "W 123"에 대해 null 값을 반환합니다. 문자열에 '0 개 이상의'숫자가 존재하므로이 동작으로 인해 혼란 스럽습니다. 나는 또한 왜 그것이 문자열 '123 W'에서 작동하는지 혼란 스럽습니다.
내 이해는 *
그것이 따르는 요소가 0 개 이상 발생 +
하고 선행 요소가 1 개 이상 발생한다는 것을 의미합니다. pattern2에 대해 제공된 예 [\d*]
에서 "123 W"에서 "123"을 성공적으로 캡처하지만 숫자가 0 개 이상 존재하므로 "W 123"에서 123을 가져 오지 않는 이유는 무엇입니까? 처음에는 존재하지 않습니다. 문자열의. 사용에 추가 된 [묵시적] 논리가 *
있습니까?
참고 : 'W 123'에서 '123'을 캡처하는 데 도움이되는 유사한 질문을 찾으려고 잠시 동안 주위를 둘러 보았지만 가장 가까운 것은 내 요구를 충족하지 않는 regexp_replace의 변형이었습니다.
따라서 regexp_count는 \ d * 패턴과 일치하는 4 개의 하위 문자열이 있음을 나타냅니다. 세 번째는 '123'입니다. 의미는 첫 번째와 두 번째가 W와 공백에서 파생되고 소스 문자열의 한 문자를 '소비'하는 길이가 0 인 결과라는 것입니다.
select test,
regexp_count(TEST,'\d*') Pattern2_c,
regexp_substr(TEST,'\d*') Pattern2,
regexp_substr(TEST,'\d*',1,1) Pattern2_1,
regexp_substr(TEST,'\d*',1,2) Pattern2_2,
regexp_substr(TEST,'\d*',1,3) Pattern2_3,
regexp_substr(TEST,'\d*',1,4) Pattern2_4
from (select '123 W' TEST from dual
union
select 'W 123' TEST from dual
);
Oracle은 길이가 0 인 문자열과 null에 대해 이상한 점이 있습니다.
그 결과는 옳지 않다고 생각하지만, 문자열에 길이가 0 인 부분 문자열이 얼마나 많은지에 대해 컴퓨터에 깊이있는 철학적 질문을한다면, 나는 어떤 대답도하지 않을 것입니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다