2017-10-17 46 views
1

我一直在試圖找到不可打印的記錄(即在ASCII 32到127之間),下面我已經提到了按照查詢它應該打印所有記錄與chr小於32或更多然後127,但它並沒有顯示出與CHR(160)的記錄,而它確實表現出與CHR(10)oracle正則表達式問題

select regexp_instr(a.COL, '[^[:print:]]$') as STRING_POSITION, 
     a.COL, dump(col) 
from tq84_compare a 
where regexp_instr(a.COL, '[^[:print:]]') > 0; 

insert into tq84_compare 
    values (11, chr(10)); 

insert into tq84_compare 
    values (11, chr(160)); 

插入記錄到tq84_compare 值 (101, '在線' || CHR (160)|| CHR(160)||字符(160));

+1

160代碼是一個很難的空間,對不對?由於'[:print:]'匹配'[\ x20- \ x7E]',空格和所有其他可打印的ASCII字符,因此預計會出現這種行爲。 –

+0

我們如何刪除它,因爲修剪不適用於chr(160) – ronil

+0

您是否需要從條目的開始/結尾刪除任何空格? –

回答

1

無法將Unicode硬盤空間與[:space:][^[:print:]]\s模式匹配。

您可以用the following solution修剪字符串:

select regexp_replace(' some stuff  ', '^[[:space:] ]+|[[:space:] ]+$', '') as result from dual 

在空間內是硬的空間。 ^[[:space:] ]+將匹配字符串開始處的所有ASCII空格和/或硬空格,[[:space:] ]+$將匹配所有ASCII空格字符和字符串末尾的硬空格。

如果你想硬空間添加到您的[^[:print:]],你需要使用的交替:

select regexp_replace(' some stuff  ', '^([^[:print:]]| )+|([^[:print:]]| )+$', '') as result from dual 

this online demo