Regex Postgresql正则表达式匹配大写,支持Unicode
书名对它的总结相当好。我正在为Postgres~运算符寻找与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? ------
=> 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有关(但据我所知,发行说明中未提及)