0

这个

  Check Load (1.0ms)  SELECT "checks".* FROM "checks" WHERE (title ~* '[p{L}]+' and state @@ 'saved')

只匹配英文字符,但我怎样才能捕捉到任何语言字符?

4

3 回答 3

1

我编写了一个将 PCRE 集成到 PostgreSQL 中的扩展:https ://github.com/petere/pgpcre 。它对 Unicode 属性有更好的支持。你可以写类似

title ~ pcre '^\p{L}'
于 2013-06-19T02:21:10.963 回答
1

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:]]我不确定这是“开箱即用”配置还是某种升级,但很高兴知道这是可能的。

于 2013-06-15T15:06:03.180 回答
0

为什么不使用普通类 - [: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)
于 2013-06-15T16:20:54.677 回答