CHR(0)
je znak používaný k ukončení řetězce v programovacím jazyce C (mimo jiné).
Když předáte CHR(0)
funkci to zase předá funkci nižší úrovně, která analyzuje řetězce, které jste předali, a vytvoří z tohoto řetězce vzor regulárního výrazu. Tento vzor regulárního výrazu bude vidět CHR(0)
a myslet si, že je to řetězec terminátor a ignorovat zbytek vzoru.
Chování je lépe vidět pomocí REGEXP_REPLACE
:
SELECT REGEXP_REPLACE( 'abc' || CHR(0) || 'e', CHR(0), 'd' )
FROM DUAL;
Co se stane, když spustíte toto:
CHR(0)
se zkompiluje do regulárního výrazu a stane se terminátorem řetězce.- Vzor je nyní pouze zakončením řetězce, a proto je vzorem řetězec nulové délky.
- Regulární výraz je poté porovnán se vstupním řetězcem a přečte první znak
a
a najde řetězec nulové délky, který může být přiřazen předa
takže nahradí nic, co se shodovalo předa
sd
dává výstupda
. - Potom se bude opakovat pro další znak transformace
b
nadb
. - a tak dále, dokud nedosáhnete konce řetězce, kdy se bude shodovat se vzorem nulové délky a přidá poslední
d
.
A dostanete výstup:
dadbdcd_ded
(kde _ je CHR(0)
postava. )
Poznámka:CHR(0)
ve vstupu není nahrazeno.
Pokud klientský program, který používáte, také zkracuje řetězec na CHR(0)
nemusíte vidět celý výstup (toto je problém s tím, jak váš klient reprezentuje řetězec, a ne s výstupem Oracle), ale lze jej zobrazit také pomocí DUMP()
:
SELECT DUMP( REGEXP_REPLACE( 'abc' || CHR(0) || 'e', CHR(0), 'd' ) )
FROM DUAL;
Výstupy:
Typ=1 Len=11: 100,97,100,98,100,99,100,0,100,101,100
[TL;DR] Co se tedy děje s
REGEXP_LIKE( '1234567890', CHR(0) )
Vytvoří vzor regulárního výrazu řetězce nulové délky a před 1
bude hledat shodu nulové délky. znak – který najde a poté vrátí, že našel shodu.