PostgreSQL正则表达式 - 任何语言

时间:2013-06-15 14:48:26

标签: regex postgresql

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

仅匹配英文字符,但如何捕获任何语言字符?

3 个答案:

答案 0 :(得分:1)

AFAIK此功能在PostgreSQL中不可用。 This answer似乎同意。它已经有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中可以使用[[:lower:]][[:upper:]]个字符类来处理Postgres,因为Linux的ctype实现(似乎是)基于UTF-8。我不确定这是一个“开箱即用”配置还是某种升级,但很高兴知道它是可能的。

答案 1 :(得分:1)

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

title ~ pcre '^\p{L}'

答案 2 :(得分: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)