2013-01-11 83 views
3

標題總結得非常好。我正在尋找一個匹配Postgres〜運算符的Unicode大寫字符的正則表達式。 最顯而易見的方法不起作用:Postgresql正則表達式匹配大寫,可識別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) 
+1

不是一個正確的答案,但''與我本地postgresql 9.2.1(而不是9.1.6)上的'[[:upper:]]'相匹配 – araqnid

+0

@araqnid在9.2中也匹配我。如果你嘗試使用9.1中的排序規則:'select'Ą'〜'[[:upper:]]'collat​​e「pl_PL」' –

+0

@Clodoaldo明確指定排序對結果沒有影響 – araqnid

回答

4

PG 9.1及更早版本的正則表達式引擎沒有正確分類其代碼點不適合它的字符一個字節。 的'Ó'的代碼點是211它得到它的權利,但'Ą'代碼點爲260,超出255

PG 9.2是在這個更好,雖然仍然是所有字母不是100%正確。看到此commit PostgreSQL中的源代碼,並且特別這些註釋的部分:

除去硬連線限制不考慮wctype.h結果 字符代碼高於255

不過,我們可以它推送到U + 7FF(我選擇了爲 2字節UTF8字符的限制),這將至少使東歐 幸福賭注待定之三解

不幸的是這並沒有回遷到9.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。