CHR(0)
е знакът, използван за завършване на низ в езика за програмиране C (наред с други).
Когато преминете CHR(0)
към функцията, той от своя страна ще го предаде на функция от по-ниско ниво, която ще анализира низовете, които сте предали, и ще изгради модел на регулярен израз от този низ. Този модел на регулярен израз ще види CHR(0)
и си помислете, че това е терминаторът на низ и игнорирайте останалата част от шаблона.
Поведението се вижда по-лесно с REGEXP_REPLACE
:
SELECT REGEXP_REPLACE( 'abc' || CHR(0) || 'e', CHR(0), 'd' )
FROM DUAL;
Какво се случва, когато стартирате това:
CHR(0)
се компилира в регулярен израз и става терминатор на низ.- Сега шаблонът е просто терминатор на низ и така шаблонът е низ с нулева дължина.
- След това регулярният израз се съпоставя с въведения низ и той чете първия знак
a
и намира, че низ с нулева дължина може да бъде съпоставен предиa
така че замества нищото, което е съпоставило предиa
сd
дава изходаda
. - След това ще се повтори за следващия символ, трансформиращ
b
къмdb
. - и така нататък, докато стигнете до края на низа, когато той ще съответства на модела с нулева дължина и ще добави крайно
d
.
И ще получите резултата:
dadbdcd_ded
(където _ е CHR(0)
характер. )
Забележка:CHR(0)
във входа не се заменя.
Ако клиентската програма, която използвате, също съкращава низа в CHR(0)
може да не видите целия изход (това е проблем с начина, по който вашият клиент представя низа, а не с изхода на Oracle), но той може също да бъде показан чрез DUMP()
:
SELECT DUMP( REGEXP_REPLACE( 'abc' || CHR(0) || 'e', CHR(0), 'd' ) )
FROM DUAL;
Изходи:
Typ=1 Len=11: 100,97,100,98,100,99,100,0,100,101,100
[TL;DR] И така, какво се случва с
REGEXP_LIKE( '1234567890', CHR(0) )
Той ще създаде шаблон за регулярен израз на низ с нулева дължина и ще търси съвпадение с нулева дължина преди 1
символ - който ще намери и след това ще върне, че е намерил съвпадение.