Postgres 正则表达式 负向前瞻

2024-04-04

场景:匹配除字符串“J01FA09”之外的任何以“J01”开头的字符串。

我很困惑为什么以下代码不返回任何内容:

SELECT 1
WHERE
    '^J01(?!FA09).*' ~ 'J01FA10'

当我能看到regexr.com https://regex101.com/r/On7Nsx/1它正在工作(我意识到正则表达式有不同的风格,这可能是该网站工作的原因)。

我已经确认在postgres 文档 https://www.postgresql.org/docs/9.1/static/functions-matching.html不过,这种负面展望是得到支持的。

表 9-15。正则表达式约束

(?!re) 负向先行匹配在任何没有子字符串的点 匹配重新开始(仅限 ARE)。前瞻约束不能包含 反向引用(参见第 9.7.3.3 节),以及其中的所有括号 被视为非捕获。


匹配以“J01”开头的任何字符串(字符串“J01FA09”除外)。

您可以在没有正则表达式的情况下使用

WHERE s LIKE 'J01%' AND s != 'J01FA09'

Here, LIKE 'J01%'需要一个字符串开头J01然后后面可能有任何字符,并且s != 'J01FA09'将过滤掉匹配项。

如果您想使用正则表达式实现相同的目的,请使用

WHERE s ~ '^J01(?!FA09$)'

The ^匹配字符串的开头,J01与字面意思相符J01子串和(?!FA09$)断言之后J01没有FA09接下来是字符串位置的结尾。如果FA09出现并且后面有字符串结尾,则不会返回匹配项。

See the 在线演示 http://rextester.com/ROISZE87157:

CREATE TABLE table1
    (s character varying)
;

INSERT INTO table1
    (s)
VALUES
    ('J01NNN'),
    ('J01FFF'),
    ('J01FA09'),
    ('J02FA09')
;
SELECT * FROM table1 WHERE s ~ '^J01(?!FA09$)';

SELECT * FROM table1 WHERE s LIKE 'J01%' AND s != 'J01FA09';
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Postgres 正则表达式 负向前瞻 的相关文章

随机推荐