场景:匹配除字符串“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(使用前将#替换为@)