3

我想向 2 个表(在多个列上)添加一些相同的约束。

为此,我想创建用于检查约束的函数。

如果值包含以下任何内容(字符串将始终包含至少一些字母),则验证应该失败:

  • ..(两个相应的点)
  • >
  • <
  • 超过 3 个连续的大写字母
  • 所有字母均为大写字母(必须至少包含 1 个小写字母)

到目前为止,我有以下内容:

CREATE FUNCTION no_forbidden_characters(text) RETURNS boolean
  LANGUAGE sql IMMUTABLE STRICT
AS $_$
  SELECT $1 !~ '[a-z]+|..|>|<';
$_$;

不确定如何连续获得最多 3 个大写字母(尽管允许多个由空格分隔的 3 个大写字母组合)

4

1 回答 1

1

我相信你可以使用

(^|[^.])[.]{2}([^.]|$)|[<>]|[[:upper:]]{4}|^[[:upper:]]+$

它匹配(因此,由于您使用的是否定的正则表达式匹配运算符,因此拒绝)以下模式:

  • (^|[^.])[.]{2}([^.]|$)- 两个点,前面是字符串开头或非点字符,后面是非点字符或字符串结尾(所以,只有..字符串,没有...
  • [<>]- 一个<>
  • [[:upper:]]{4}- 四个连续的大写字母
  • ^[[:upper:]]+$- 完全由大写字母组成的字符串。

请参阅正则表达式演示

于 2020-11-24T12:36:51.367 回答