这个
Check Load (1.0ms) SELECT "checks".* FROM "checks" WHERE (title ~* '[p{L}]+' and state @@ 'saved')
只匹配英文字符,但我怎样才能捕捉到任何语言字符?
这个
Check Load (1.0ms) SELECT "checks".* FROM "checks" WHERE (title ~* '[p{L}]+' and state @@ 'saved')
只匹配英文字符,但我怎样才能捕捉到任何语言字符?
我编写了一个将 PCRE 集成到 PostgreSQL 中的扩展:https ://github.com/petere/pgpcre 。它对 Unicode 属性有更好的支持。你可以写类似
title ~ pcre '^\p{L}'
AFAIK 此功能在 PostgreSQL 中不可用。这个答案似乎同意。它已经 3 岁了,所以从那时起可能发生了一些变化,但如果有的话,我不知道。
来自原始海报:
PostgreSQL 不支持像 .NET 那样基于 Unicode 字符数据库的字符类。你会得到更标准的 [[:alpha:]] 字符类,但这取决于语言环境,可能不会涵盖它。
您可能只需将不需要的 ASCII 字符列入黑名单并允许所有非 ASCII 字符即可摆脱困境。例如类似的东西
[^\s!"#$%&'()*+,\-./:;<=>?\[\\\]^_`~]+
(JavaScript 也没有非 ASCII 字符类。甚至 [[:alpha:]]。)
例如,给定 v_text 作为要清理的文本变量:
-- Allow internationalized text characters and remove undesired characters v_text = regexp_replace( lower(trim(v_text)), '[!"#$%&()*+,./:;<=>?\[\\\]\^_\|~]+'
编辑:还请注意下面的@depesz 答案。由于 Linux 的 ctype 实现(似乎是)基于 UTF-8,因此可以在 Linux中获取[[:lower:]]
和在 Postgres 上工作的字符类。[[:upper:]]
我不确定这是“开箱即用”配置还是某种升级,但很高兴知道这是可能的。
为什么不使用普通类 - [:lower:] 和 [:upper:] ?检查这个:
$ select w, w ~ '^[[:lower:][:upper:]]+$' from ( values ( 'aBc'::text ), ('żÓŁW'), ('123')) as x (w);
w | ?column?
------+----------
aBc | t
żÓŁW | t
123 | f
(3 rows)