【问题标题】:PostgreSQL "invalid regular expression: invalid escape \ sequence" when using Regex constraintPostgreSQL“无效的正则表达式:无效的转义\序列”使用Regex约束时
【发布时间】:2020-04-14 09:49:04
【问题描述】:

这是我的 SQL 代码:

CREATE TABLE country (
    id      serial          NOT NULL PRIMARY KEY,
    name    varchar(100)    NOT NULL CHECK(name ~ '^[-\p{L} ]{2,100}$'),
    code    varchar(3)      NOT NULL
);

注意name 属性中的regex 约束。上面的代码将产生ERROR: invalid regular expression: invalid escape \ sequence

我尝试使用转义CHECK(name ~ E'^[-\\p{L} ]{2,100}$'),但再次导致ERROR: invalid regular expression: invalid escape \ sequence

我也知道,如果我这样做 CHECK(name ~ '^[-\\p{L} ]{2,100}$'),CHECK(name ~ E'^[-\p{L} ]{2,100}$'), - SQL 将收到错误的正则表达式,因此在插入有效数据时会引发约束冲突。

PostgreSQL 正则表达式约束不支持正则表达式模式 (\p) 或类似的东西吗?


编辑#1

正则表达式 ^[-\p{L} ]{2,100}$ 基本上允许 2-100 个字符之间的国家名称,允许的字符是连字符、空格和所有字母(包括拉丁字母)。

注意: SQL 在创建表期间运行良好,但在插入有效数据时会抛出错误。

补充说明:我使用的是 PostgreSQL 12.1

【问题讨论】:

  • Edit 问题并解释模式应该匹配的内容。
  • 此代码seems to work fine.
  • \p{L} 匹配任何字母,使用 POSIX 字符类 [:alpha:] 可能会得到相同的行为,试试 '^[-[:alpha:] ]{2,100}$'
  • postgresql.org/docs/current/…XQuery character class elements using \p{UnicodeProperty} or the inverse \P{UnicodeProperty} are not supported.。我读到:“不 - 不支持”。
  • @stickybit 我编辑了问题并解释了模式

标签: sql regex postgresql constraints


【解决方案1】:

\p{L}Unicode 类别(属性)类匹配任何字母,但在PostgreSQL regex 中不受支持。

您可以使用[:alpha:] POSIX 字符类获得相同的行为

'^[-[:alpha:] ]{2,100}$'

【讨论】:

  • 我以为[:alpha:]就等于[a-zA-Z]?即使在regex101 上它也不起作用,但它可以在 PostgreSQL 数据库中运行。怎么样?
  • @ProgramerBeginner 所以,你已经了解了 POSIX 字符类,很好。 POSIX 字符类在几乎所有使用它们的引擎中都是区域感知的,至少对于 POSIX 兼容的正则表达式来说是正确的。在 PostgreSQL 中,POSIX 字符类的行为与 POSIX 兼容引擎中的一样,它匹配的不仅仅是 [A-Za-z]。至于在 regex101.com 上测试 POSIX 字符类,你只需要知道how to do it。注意,regex101.com 不支持 POSIX 正则表达式测试,仅支持 JS、PCRE、Python re 和 Go regexp (RE2)。
猜你喜欢
  • 1970-01-01
  • 2018-02-15
  • 2019-05-12
  • 2022-01-25
  • 1970-01-01
  • 2022-11-04
  • 1970-01-01
  • 2020-09-02
  • 2023-03-06
相关资源
最近更新 更多