3

标题总结得很好。我正在为 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)
4

2 回答 2

4

PG 9.1 和更早版本的正则表达式引擎无法正确分类代码点不适合一个字节的字符。代码点为'Ó'211 是正确的,但代码点'Ą'是 260,超过 255。

PG 9.2 在这方面做得更好,但仍然不是 100% 适合所有字母。请参阅 PostgreSQL 源代码中的此提交,尤其是评论的这些部分:

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

不过,我们可以将它推高到 U+7FF(我选择它作为 2 字节 UTF8 字符的限制),这至少会让东欧人高兴地等待更好的解决方案

不幸的是,这没有向后移植到 9.1

于 2013-01-12T13:48:33.740 回答
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 上测试。

于 2013-06-09T18:27:44.213 回答