gpt4 book ai didi

regex - 只匹配字符串的末尾

转载 作者:行者123 更新时间:2023-11-29 13:20:03 26 4
gpt4 key购买 nike

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com