regex - 只匹配字符串的末尾

标签 regex postgresql

我想保护下表的email字段:

CREATE TABLE users (
  email VARCHAR(255) NULL CHECK (email ~* '\A[^@]+@[^@]+\Z')
);

我想做的是允许这样的字符串:

bob@example

但我想避免这样的字符串:

bob@example\nfuu

我听说 \Z 约束允许在另一行之后的任何字符(使用 \n)。

根据正则表达式的最佳实践,\z 优于 \Z 因为它只允许一行,但是 it seems to be not supported by PostgreSQL .而 $ 也不是更好。

我说的对吗?

编辑:

我测试过这个:

CREATE TABLE users (
  email VARCHAR(255) NULL CHECK (email ~* '\A[^@\n]+@[^@\n]+\Z')
);

CREATE UNIQUE INDEX users__lower_case__email ON users(lower(email));

--

INSERT INTO users (email) VALUES ('\nfoo\n@\nbar\n');

显然约束不起作用:在表中添加了错误的电子邮件。

最佳答案

请注意,否定字符类匹配集合中定义的任何字符。因此,[^@] 匹配除 @ 之外的任何字符,包括换行符。要排除换行符,只需将其添加到类中即可。

使用

email ~* '\A[^@\n]+@[^@\n]+\Z'

仅作为 \Z matches only at the end of the string这个正则表达式不可能允许在输入中换行。

关于regex - 只匹配字符串的末尾,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43595145/

相关文章:

regex - VBA正则表达式单词后的所有内容

c# - 从字符串中返回特定单词后的数字

regex - 如何用 "^@"替换 "\r"

javascript - 删除所有换行符,但只删除一个换行符?

python - 在提交期间删除错误查询

sql - Postgresql 如何更新每行最大值的列?

javascript - 匹配 Javascript 代码语句的结尾

postgresql - 使用 pg_dump 和 psql -U postgres db_name < ... 移动数据库导致 "ERROR: relation "table_name“不存在”

php - 如何在 Symfony 中设置 ORM 两个实体 ID

转换为 jsonb 的 bool 值的 Postgresql 格式函数