2017-10-17 3 views
1

私は、印刷可能でないレコード(つまりASCII 32から127の間)を探しています。以下では、クエリごとにchrを使ってすべてのレコードを32以下それはtq84_compare 値 (101、 'オンライン' || 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)); 

インサートCHR持つレコードを表示して行いながら、127それは、CHR(160)を持つレコードを表示しません(160)|| chr(160)|| chr(160));

+1

160コードはハードなスペースですね。 '[:print:]'は '[\ x20- \ x7E]'、スペース、その他すべての印字可能なASCII文字と一致するので、これは期待される動作です。 –

+0

トリムがchr(160)で機能しないので、どうやって削除できますか? – ronil

+0

エントリの開始/終了から空白を削除する必要がありますか? –

答えて

1

[:space:][^[:print:]]\sのパターンでは、Unicodeのハードスペースを一致させることはできません。

あなたは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を参照してください。