我想保护下表的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/