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

Regex Postgresql正则表达式匹配大写,支持Unicode,regex,postgresql,unicode,Regex,Postgresql,Unicode,书名对它的总结相当好。我正在为Postgres~运算符寻找与Unicode大写字符匹配的正则表达式。 显而易见的方法行不通: => select 'A' ~ '[[:upper:]]'; ?column? ---------- t (1 row) => select 'Ó' ~ '[[:upper:]]'; ?column? ---------- t (1 row) => select 'Ą' ~ '[[:upper:]]'; ?column? ------

书名对它的总结相当好。我正在为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)

PG 9.1和更旧版本的regexp引擎无法正确地对代码点不适合一个字节的字符进行分类。
“Ó”
的代码点是211,这是正确的,但是
“Ą”
的代码点是260,超过255

第9.2页在这方面做得更好,尽管并非所有字母表都100%正确。请参见PostgreSQL源代码,尤其是注释的以下部分:

移除硬连线限制,不考虑WCyType h结果 255以上的字符代码

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


不幸的是,这并没有向后移植到9.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上测试。

答案不正确,但与我本地的postgresql 9.2.1(但不是9.1.6)上的
。如果您尝试使用9.1中的排序规则会怎么样?:
select'Ą'~'[:upper:]'collate“pl_pl”
@Clodoaldo显式指定排序规则对结果没有影响,因此它看起来像是一个在9.2中最终修复的bug?可能与报告时修复的bug有关(但据我所知,发行说明中未提及)