Postgresql正则表达式匹配大写,支持Unicode

时间:2013-01-11 12:02:17

标签: regex postgresql unicode

标题总结得很好。我正在寻找一个匹配Postgres~运算符的Unicode大写字符的正则表达式。 显而易见的方法不起作用:

=> select 'A' ~ '[[:upper:]]';
 ?column? 
----------
 t
(1 row)

=> select 'Ó' ~ '[[:upper:]]';
 ?column? 
----------
 t
(1 row)

=> select 'Ą' ~ '[[:upper:]]';
 ?column? 
----------
 f
(1 row)

我正在使用Postgresql 9.1,我的语言环境设置为pl_PL.UTF-8。订购工作正常。

=> show LC_CTYPE;
  lc_ctype   
-------------
 pl_PL.UTF-8
(1 row)

2 个答案:

答案 0 :(得分:4)

PG 9.1和旧版本的regexp引擎无法正确分类其代码点不适合一个字节的字符。 'Ó'的代码点为211,它正确,但'Ą'的代码点为260,超过255。

PG 9.2在这方面做得更好,但对所有字母表仍然不是100%正确。请参阅PostgreSQL源代码中的commit,特别是注释的这些部分:

  

删除硬连线限制,不考虑wctype.h的结果   字符代码高于255

  

尽管如此,我们还是可以把它推到U + 7FF(我选择了它作为极限   2字节UTF8字符),这将至少使东欧人   快乐等待更好的解决方案

不幸的是,这并没有被移植到9.1

答案 1 :(得分:1)

我发现perl正则表达式可以完美地处理Unicode。

create extension plperl;

create function is_letter_upper(text) returns boolean
immutable strict language plperl
as $$
    use feature 'unicode_strings';
    return $_[0] =~ /^\p{IsUpper}$/ ? "true" : "false";
$$;

使用perl 5.16.2在postgres 9.2上测试。