regex 我如何在Redshift数据库中找到任何非ASCII字符

ttcibm8c  于 2022-11-18  发布在  其他
关注(0)|答案(3)|浏览(106)

我有一个数据库表,我想返回所有的值,其中一列包含一个非ASCII字符的字符串中的任何地方。
有简单的方法吗?
我试过了

select col_name,  regexp_instr(col_name,'[^[:ascii:]]') 
from test_table s
where created > sysdate - 1 
and regexp_instr(col_name,'[^[:ascii:]]') > 0 
limit 5;

但得到以下错误:

error:  Invalid character class name, collating name, or character range.  The error occured while parsing the regular expression: '[^[:>>>HERE>>>ascii:]]'.
  code:      8002
  context:   T_regexp_init
  query:     5059536
  location:  funcs_expr.cpp:130
  process:   query20_31 [pid=7903]

谢谢你!

798qvoo8

798qvoo81#

我最近试图完成类似的事情,但是@BigDataKid的解决方案(在正则表达式中写入'[^\x00-\x7F]')不起作用。
通常,反斜杠与文字字符组合可以创建具有特殊含义的正则表达式标记,在本例中,\x表示“十六进制值为的字符”,其中007F是十六进制值。
虽然Postgres支持它(see 9.7.3.3. Regular Expression Escapes),但Redshift的正则表达式引擎似乎不支持。
我找到的最简单明了的解决方法是:

SELECT column_name,
       CASE
           WHEN regexp_instr(column_name, '[^[:print:][:cntrl:]]') > 0 THEN TRUE
           ELSE FALSE END AS has_non_ascii_char
FROM table_name
WHERE has_non_ascii_char;

正则表达式解释:

外部括号[](或者列表,如果您愿意)称为“括号表达式”,脱字符(^)表示否定,因此[^]翻译为“匹配列表中没有的任何字符”。
在列表中,我们有[:print:][:cntrl:],它们被称为“POSIX字符类”。[:print:]是指任何可打印的ASCII字符(包括空格),[:cntrl:]是指所有ASCII控制字符(例如制表符),它们合起来应该涵盖所有ASCII字符。

lokaqttq

lokaqttq2#

您可以通过查看下表来选择要使用的范围或字符:http://unicode-table.com/en/
请看下面的代码,其中我根据特定的字符范围进行过滤。

dev=# create table tb1 ( id integer, col1 varchar(10) , col2 varchar(10) ) distkey(id);
CREATE TABLE

dev=# insert into tb1 values (1, 'ABC', 'DEF');
INSERT 0 1

dev=# insert into tb1 select 1, chr(638), chr(640);
INSERT 0 1
dev=# insert into tb1 select 4, concat(concat('AB', chr(638)),'CD') , chr(640);                                                                                  
INSERT 0 1

dev=# select * from tb1;
 id | col1  | col2 
----+-------+------
  4 | ABɾCD | ʀ
  1 | ABC   | DEF
  1 | ɾ     | ʀ
(3 rows)

dev=# select id, col1,  regexp_instr(col1,'[^\x00-\x7F]') , col2,  regexp_instr(col2,'[^\x00-\x7F]')  from tb1;
 id | col1  | regexp_instr | col2 | regexp_instr 
----+-------+--------------+------+--------------
  4 | ABɾCD |            3 | ʀ    |            1
  1 | ABC   |            0 | DEF  |            0
  1 | ɾ     |            1 | ʀ    |            1
(3 rows)
vhipe2zx

vhipe2zx3#

SELECT regexp_replace(column_name, '[^'||chr(32)||'-'||chr(126)||']','') 
FROM table_name 
WHERE regexp_count(column_name, '[^'||chr(32)||'- '||chr(126)||']')> 0

也许它会对某人和https://www.asciitable.com/有用

相关问题